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神经网络 的相关文章

  • str.translate 与 str.replace - 何时使用哪一个?

    何时以及为什么使用前者而不是后者 反之亦然 目前尚不完全清楚为什么有些人使用前者以及为什么有些人使用后者 它们有不同的目的 translate只能用任意字符串替换单个字符 但一次调用可以执行多次替换 它的参数是一个特殊的表 它将单个字符映射
  • Python 转换矩阵

    我有一个如下所示的列表 2 1 3 1 2 3 1 2 2 2 我想要的是一个转换矩阵 它向我显示如下序列 1 后跟 1 的频率是多少 1 后面跟着 2 的频率是多少 1 后跟 3 的频率是多少 2 后跟 1 的频率是多少 2 后跟 2 的
  • 通过 python 中的另外两个修改数组[重复]

    这个问题在这里已经有答案了 假设我们有三个一维数组 A 长度为 5 B 长度相同 示例中为5 C 更长 比如长度为 100 C最初用零填充 A给出索引C应更改的元素 它们可能会重复 以及B给出应添加到初始零的值C 例如 如果A 1 3 3
  • 键入的完整命令行

    我想获得输入时的完整命令行 This join sys argv 在这里不起作用 删除双引号 另外 我不想重新加入已解析和拆分的内容 有任何想法吗 你太迟了 当键入的命令到达 Python 时 您的 shell 已经发挥了它的魔力 例如 引
  • Flask 中“缺少 CSRF 令牌”,但它在模板中呈现

    问题 当我尝试登录 使用 Flask login 时 我得到Bad Request The CSRF session token is missing但令牌正在呈现 在模板中 secret key 已设置 并且我在本地运行localhost
  • 为什么在访问 Python 对象属性时使用 getattr() 而不是 __dict__ ?

    在具有一定程度的 Python 对象自省的源代码示例和 SO 答案中 常见的模式是 getattr some object attribute name string 是否有理由优先选择这种模式 some object dict attri
  • 查找正在导入哪些 python 模块

    从应用程序中使用的特定包中查找所有 python 模块的简单方法是什么 sys modules是将模块名称映射到模块的字典 您可以检查其键以查看导入的模块 See http docs python org library sys html
  • App Engine NDB:如何访问属性的 verbose_name

    假设我有这个代码 class A ndb Model prop ndb StringProperty verbose name Something m A m prop a string value 当然 现在如果我打印 m prop 它会
  • 使用pathlib获取主目录

    翻看新的pathlib在 Python 3 4 中 我注意到没有任何简单的方法来获取用户的主目录 我能想到的获取用户主目录的唯一方法是使用旧的os path像这样的库 import pathlib from os import path p
  • 用 Python 绘制直方图

    我有两个列表 x 和 y x 包含字母表 A Z Y 包含它们在文件中的频率 我尝试研究如何在直方图中绘制这些值 但在理解如何绘制它方面没有成功 n bins patches plt hist x 26 normed 1 facecolor
  • 为什么 re.findall 在查找字符串中的三元组项时不具体。 Python

    所以我有四行代码 seq ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA OR 0 re findall r ATG 9 TAA TAG TGA seq 首先让我解释一下我正在尝试做什么 如果这令人困惑
  • Python:在字典中查找具有唯一值的键?

    我收到一个字典作为输入 并且想要返回一个键列表 其中字典值在该字典的范围内是唯一的 我将用一个例子来澄清 假设我的输入是字典 a 构造如下 a dict a cat 1 a fish 1 a dog 2 lt unique a bat 3
  • python Recipe:列出最接近等于值的项[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 考虑像这样的列表 0 3 7 10 12 15 19 21 我想获得最接近任何值的最近的最小数字 所以如果我通过4 我会得到3 如果我
  • 为什么 Collections.counter 这么慢?

    我正在尝试解决罗莎琳德的基本问题 即计算给定序列中的核苷酸 并在列表中返回结果 对于那些不熟悉生物信息学的人来说 它只是计算字符串中 4 个不同字符 A C G T 出现的次数 我期望collections Counter是最快的方法 首先
  • 如何按 pandas 中的值对系列进行分组?

    我现在有一只熊猫Series与数据类型Timestamp 我想按日期对其进行分组 并且每组中有许多行具有不同的时间 看似显而易见的方法类似于 grouped s groupby lambda x x date 然而 熊猫的groupby按索
  • 如何通过 Python Requests 库使用基本 HTTP 身份验证?

    我正在尝试在 Python 中使用基本的 HTTP 身份验证 我正在使用Requests https docs python requests org 图书馆 auth requests post http hostname auth HT
  • 从 wxPython 事件处理程序中调用函数

    我正在努力寻找一种在 wxPython 事件处理函数中使用函数的方法 假设我有一个按钮 单击该按钮时 它会使用事件处理程序运行一个名为 OnRun 的函数 但是 用户忘记单击 OnRun 按钮之前的 RadionButton 我想弹出一个
  • 如何使用 enumerate 来倒数?

    letters a b c 假设这是我的清单 在哪里for i letter in enumerate letters 将会 0 a 1 b 2 c 我怎样才能让它向后枚举 如 2 a 1 b 0 c 这是一个很好的解决方案并且工作完美 i
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org
  • pandas.read_fwf 忽略提供的数据类型

    我正在从文本文件导入数据框 我想指定列的数据类型 但 pandas 似乎忽略了dtype input 一个工作示例 from io import StringIO import pandas as pd string USAF WBAN S

随机推荐

  • 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 定义激活函