C++/Python机器学习—BP神经网络

2023-11-06

 一、Python

 

import random
import numpy as np
import matplotlib.pyplot as plt

# 定义激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 定义激活函数的导数
def sigmoid_derivative(x):
    sig = sigmoid(x)
    return sig * (1 - sig)

# 定义预测函数
def predict(x, w, b):
    return x * w + b

# 定义训练函数
def train(x, y, w, b, learning_rate, epochs):
    n = x.shape[0]
    for i in range(epochs):
        random_index = random.randint(0, n-1)
        input_val = x[random_index]
        target_val = y[random_index]

        # 前向传播
        output_val = predict(input_val, w, b)

        # 反向传播
        output_error = target_val - output_val
        output_delta = output_error

        # 更新权重和偏置
        w += learning_rate * output_delta * input_val
        b += learning_rate * output_delta

    return w, b

# 定义生成数据函数
def generate_data(true_w, true_b, num_examples, x_range):
    x = np.random.uniform(-x_range, x_range, size=num_examples)
    noise = np.random.normal(scale=0.1, size=num_examples)
    y = true_w * x + true_b + noise
    return x, y

# 定义真实的权重和偏置
true_w = 2
true_b = 4.2
x_range = 10

# 生成数据
num_examples = 1000
x, y = generate_data(true_w, true_b, num_examples, x_range)

# 初始化权重和偏置
w = 0
b = 0

# 设置学习率和迭代次数
learning_rate = 0.01
epochs = 1000

# 训练模型
w, b = train(x, y, w, b, learning_rate, epochs)

# 输出模型权重和偏置
print("Model weights: w={}, b={}".format(w, b))

# 预测新数据
x_pred = np.array([6, 7, 8, 9, 10])
y_pred = predict(x_pred, w, b)

# 输出预测结果
print("Input values: {}".format(x_pred))
print("Predicted values: {}".format(y_pred))

# 绘制数据和模型预测
plt.scatter(x, y, s=0.1)
plt.plot(x_pred, y_pred, color='red')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

二、C++

#include <iostream>
#include <vector>
#include <random>
#include <cmath>

using namespace std;

// 定义激活函数
double sigmoid(double x) {
    return 1 / (1 + exp(-x));
}

// 定义激活函数的导数
double sigmoid_derivative(double x) {
    double sig = sigmoid(x);
    return sig * (1 - sig);
}

// 定义预测函数
vector<double> predict(vector<double>& x, vector<double>& w, double b) {
    vector<double> y_pred;
    for (double input : x) {
        double output = input * w[0] + b; // 计算输出层输出
        y_pred.push_back(output); // 将输出添加到预测向量中
    }
    return y_pred;
}

// 定义训练函数
void train(vector<double>& x, vector<double>& y, vector<double>& w, double& b, double learning_rate, int epochs) {
    int n = x.size();
    default_random_engine generator;
    uniform_int_distribution<int> distribution(0, n - 1);

    for (int i = 0; i < epochs; i++) {
        int random_index = distribution(generator);
        double input = x[random_index];
        double target = y[random_index];

        // 前向传播
        double output = input * w[0] + b; // 计算输出层输出

        // 反向传播
        double output_error = target - output; // 计算输出层误差
        double output_delta = output_error; // 计算输出层误差项

        // 更新权重和偏置
        w[0] += learning_rate * output_delta * input;
        b += learning_rate * output_delta;
    }
}

// 定义生成数据函数
void generate_data(double w, double b, int num_examples, vector<double>& x, vector<double>& y, double x_range) {
    // w: 真实权重
    // b: 真实偏置
    // num_examples: 样本数量
    // x: 特征向量
    // y: 标签向量
    // x_range: 特征范围
    default_random_engine generator; // 定义随机数生成器
    uniform_real_distribution<double> distribution(-x_range, x_range); // 定义均匀分布
    for (int i = 0; i < num_examples; i++) { // 生成数据
        double feature = distribution(generator); // 生成特征
        x.push_back(feature);
        double dot_product = w * feature; // 计算点积
        y.push_back(dot_product + b + distribution(generator)); // 添加噪声
    }
}

int main() {
    // 定义真实的权重和偏置
    double true_w = 2;
    double true_b = 4.2;
    double x_range=2;
    // 生成数据
    vector<double> x;
    vector<double> y;
    int num_examples = 1000;
    generate_data(true_w, true_b, num_examples, x, y,x_range);

    // 初始化权重和偏置
    vector<double> w = {0};
    double b = 0;

    // 设置学习率和迭代次数
    double learning_rate = 0.01;
    int epochs = 1000;

    // 训练模型
    train(x, y, w, b, learning_rate, epochs);

    // 输出模型权重和偏置
    cout << "Model weights: w=" << w[0] << ", b=" << b << endl;
    
    // 预测新数据
    vector<double> x_pred = {6, 7, 8, 9, 10};
    vector<double> y_pred = predict(x_pred, w, b);

    // 输出预测结果
    cout << "Input values: ";
    for (double x_val : x_pred) {
        cout << x_val << " ";
    }
    cout << endl;

    cout << "Predicted values: ";
    for (double y_val : y_pred) {
        cout << y_val << " ";
    }
    cout << endl;

    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++/Python机器学习—BP神经网络 的相关文章

  • (discord.py) 尝试更改成员角色时,“用户”对象没有属性“角色”

    因此 我正在尝试编写一个机器人 让某人在命令中指定的主持人指定的一段时间内暂停角色 我知道该变量称为 小时 即使它目前以秒为单位 我稍后会解决这个问题 基本上 它是由主持人在消息 暂停 personmention numberofhours
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • IRichBolt 在storm-1.0.0 和 pyleus-0.3.0 上运行拓扑时出错

    我正在运行风暴拓扑 pyleus verbose local xyz topology jar using storm 1 0 0 pyleus 0 3 0 centos 6 6并得到错误 线程 main java lang NoClass
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • Lombok首字母小写,第二个字母大写导致无法序列化的问题

    解决办法 在属性上添加以下注解 JsonProperty value xXxxx
  • JSP数据交互(一 response对象)

    response对象 JSP内置对象response response对象 转发与重定向 什么是转发 什么是重定向 JSP内置对象response 学习了如何使用JSP技术获取请求信息 JSP技术是如何将服务器响应返回给客户端的 下面介绍J
  • C语言指针、字符串以及字符的异同

    文章目录 介绍 小实验1 小实验2 在单片机中的应用 介绍 指针 是存放某种特定变量的特定地址 字符 单引号内的字符 占八位 字符串 多个字符加一个结束符 0 组成 但其本质是一个指向第一个字符的指针 小实验1 任务 判断 hello wo
  • JavaScript的三大组成部分之BOM

    目录 一 BOM基本介绍 1 基本概念 2 BOM 的组成 3 window对象 1 基本概念 2 常用属性 3 常用事件 4 常用方法 二 内置对象 1 Math数学对象 2 Date 日期对象 3 字符串对象 一 BOM基本介绍 1 基
  • windows加固-网络安全配置

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 协议安全 SYN攻击保护 启用TCP IP筛选 关闭139端口为例 关闭ICMP 禁ping 更改远程终端默认3389端口 关闭445 5355端口 系统防火墙 开
  • 神经网络之反向传播算法(自适应矩估计算法Adam变形形式之Adamax、Nadam)

    文章目录 自适应矩估计算法 Adam 的两种变形形式 1 Adamax算法原理 2 Nadam算法原理 3 算法实现 3 1 Adamax训练过程 3 2 Adamax测试过程及结果 3 3 Nadam训练过程 3 4 Nadam测试过程及
  • boost入门(一):boost简介

    前言 发现自己做为C 竟然没有用过boost 特地学习下如何使用boost 我作为初学者 会从入门指南开始 一点点深入了解boost 本文采用的版本是boost 1 75 0 boost 介绍 boost 是一个跨平台的C 工具库 是的 没
  • SQL Server入门(一) SQL Server2017 Developer和 SQL Server2017 Express 等各版本的区别。

    参考 http www shareblogs top 427 软件下载 https www microsoft com zh cn sql server sql server downloads https www microsoft co
  • 伺服速度控制模式接线图_伺服控制的三种模式,接线方式与参数设置的讲解

    伺服电机速度控制和转矩控制都是用模拟量来控制 位置控制是通过发脉冲来控制 具体采用什么控制方式要根据客户的要求以及满足何种运动功能来选择 接下来 给大家介绍伺服电机的三种控制方式 如果您对电机的速度 位置都没有要求 只要输出一个恒转矩 当然
  • 统计连续字符-2022年全国青少年信息素养大赛Python国赛第7题

    导读 超平老师计划推出 全国青少年信息素养大赛Python编程真题解析 50讲 这是超平老师解读Python编程挑战赛真题系列的第9讲 全国青少年信息素养大赛 原全国青少年电子信息智能创新大赛 是 世界机器人大会青少年机器人设计与信息素养大
  • 电磁仿真:十年磨一剑!基于HFSS、ADS微带滤波器仿真与设计

    作者 stone 仿真秀平台作者 CAE工程师如何提高仿真实力 冲击高薪 戳此了解详情 导读 自毕业至今 从事微波射频相关工作已经十年了 回想这个行业的点点滴滴 有一些个人的学习心得体会和大家分享一下 实践是检验真理的唯一标准 这句话一直伴
  • RNA-seq——三、使用Hisat2进行序列比对

    步骤 1 下载对应的index 2 序列比对 3 samtools 将sam文件转为bam文件 4 将bam文件载入IGV 为什么要比对 https www jianshu com p 681e02e7f9af Jimmy老师主要演示了四种
  • 什么是隐马尔可夫模型(HMM)?案例介绍

    HMM简介 隐马尔可夫模型 Hidden Markov Model HMM 是统计模型 它用来描述一个含有隐含未知参数的马尔可夫过程 其难点是从可观察的参数中确定该过程的隐含参数 然后利用这些参数来作进一步的分析 例如模式识别 一 简单案例
  • 微信小程序crypto-js AES 加解密数据

    微信小程序在与后台交互数据过程中 敏感数据需要加解密 本篇博客介绍在微信小程序中如何使用 crypto js 中的 AES 算法加解密数据 使用crypto js加解密详解 https blog csdn net Umbrella Um a
  • lua取模运算math.fmod和% 的区别

    我们知道 取模就是求余的意思 比如3 2 1这样子 lua中的 就是求余的运算符号 此外在数学库中还有一个math fmod的函数 他们都能进行求余运算 print 15 4 math fmod 15 4 输出 0 1 0 1 另外可以对小
  • C语言函数大全-- u 开头的函数

    u 开头的函数 1 ultoa 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 ungetc 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 ungetch 3 1 函数说明 3 2 演示示例 3 3 运行结果 4 un
  • python集合中的元素是否可以重复_python中集合中的元素是否可以重复

    python中集合中的元素不可以重复 集合是一个无序的不重复元素序列 我们可以使用大括号 或者set 函数来创建一个集合 具体语法为 parame value01 value02 python中集合中的元素不可以重复 推荐学习 python
  • vue elementui导航菜单不对齐

    解决方法 给 el aside添加text align start el aside background color 3A4E67 color fff line height 200px text align start
  • Android 围绕中心旋转动画

    Android 围绕中心旋转动画 一 简介 开发中遇到扫描蓝牙动画需求 如下图所示 因此以下简单记录一下 方便以后使用 Android 平台提供了两类动画 一类是 Tween 动画 即通过对场景里的对象不断做图像变换 平移 缩放 旋转 产生
  • C++/Python机器学习—BP神经网络

    一 Python import random import numpy as np import matplotlib pyplot as plt 定义激活函数 def sigmoid x return 1 1 np exp x 定义激活函