python3_实现BP神经网络 + BP神经网络应用实例

0.目录

1.BP神经网络简介

2.前期理论准备

2.算法数学原理

(一)符号说明

(二)公式推导

3.python实现(python3编程实现)

(一)sigmoid函数

(二)BP主函数实现

4.数据格式

1.BP神经网络简介

BP神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。

目录

0.目录

1.BP神经网络简介

2.前期理论准备

2.算法数学原理

(一)符号说明

(二)公式推导

3.python实现(python3编程实现)

(一)sigmoid函数

(二)BP主函数实现

4.数据格式


优点

  • 1.具有任意复杂的模式分类能力和优良的多维函数映射能力,解决了简单感知器不能解决的异或问题的问题(参考博客:https://www.jianshu.com/p/a25788130897 或 https://www.cnblogs.com/xym4869/p/11282469.html
  • 2.从结构上讲,BP神经网络具有输入层、隐含层和输出层
  • 3.从本质上讲,BP算法就是以网络误差平方目标函数、采用梯度下降法来计算目标函数的最小值。基本BP算法包括信号的前向传播误差的反向传播两个过程。

缺点

  • 1.学习速度慢,即使是一个简单的过程,也需要几百次甚至上千次的学习才能收敛。
  • 2.容易陷入局部极小值
  • 3.网络层数、神经元个数的选择没有相应的理论指导
  • 4.网络推广能力有限。

应用

  • 1.函数逼近
  • 2.模式识别
  • 3.分类
  • 4.数据压缩

2.前期理论准备

网络训练的目标:找到合适的权值和阈值,使得误差E最小。

sigmoid函数:在信息科学当中,由于其单增以及其反函数单增等性质,sigmoid函数常被用作神经网络的阈值函数,将变量映射当0和1之间。(该函数的对x的求导也应该理解)

2.算法数学原理

(一)符号说明

Xi: 输入信号。

Xd: 隐层的阈值(是从求和函数中-θ中分离出的-1)。

Vih: 第h个隐层神经元所对应输入信号Xi的权值。

αh: 第h个隐层神经元的输入。

-γh=--1*γh:隐层神经元的阈值。

bh: 第h个隐层神经元的输入。

ωhj: 第j个输出层神经元所对应的隐层神经元输出bh的权值。

-θj=-1*θj:  输出层神经元的阈值(bq)

:第j个输出层神经元的输出(预测输出值,yj为真实值)

(二)公式推导

通过公式变换可得输出层权值与阈值的变化量:

同理可得隐层权值和阈值的变化量:

3.python实现(python3编程实现)

(一)sigmoid函数

def sigmoid(x):
    """
    隐含层和输出层对应的函数法则
    """
    return 1/(1+np.exp(-x))

(二)BP主函数实现

def BP(data_tr, data_te, maxiter=600):

    # --pandas是基于numpy设计的,效率略低
    # 为提高处理效率,转换为数组
    data_tr, data_te = np.array(data_tr), np.array(data_te)

    # --隐层输入
    # -1: 代表的是隐层的阈值
    net_in = np.array([0.0, 0, -1])
    w_mid = np.random.rand(3, 4)          # 隐层权值阈值(-1x其中一个值:阈值)

    # 输出层输入
    # -1:代表输出层阈值
    out_in = np.array([0.0, 0, 0, 0, -1])
    w_out = np.random.rand(5)             # 输出层权值阈值(-1x其中一个值:阈值)
    delta_w_out = np.zeros([5])           # 存放输出层权值阈值的逆向计算误差
    delta_w_mid = np.zeros([3, 4])        # 存放因此能权值阈值的逆向计算误差
    yita = 1.75                           # η: 学习速率
    Err = np.zeros([maxiter])             # 记录总体样本每迭代一次的错误率

    # 1.样本总体训练的次数
    for it in range(maxiter):

        # 衡量每一个样本的误差
        err = np.zeros([len(data_tr)])

        # 2.训练集训练一遍
        for j in range(len(data_tr)):
            net_in[:2] = data_tr[j, :2]                       # 存储当前对象前两个属性值
            real = data_tr[j, 2]

            # 3.当前对象进行训练
            for i in range(4):
                out_in[i] = sigmoid(sum(net_in*w_mid[:, i]))  # 计算输出层输入
            res = sigmoid(sum(out_in * w_out))                # 获得训练结果

            err[j] = abs(real - res)

            # --先调节输出层的权值与阈值
            delta_w_out = yita*res*(1-res)*(real-res)*out_in  # 权值调整
            delta_w_out[4] = -yita*res*(1-res)*(real-res)     # 阈值调整
            w_out = w_out + delta_w_out

            # --隐层权值和阈值的调节
            for i in range(4):
                # 权值调整
                delta_w_mid[:, i] = yita * out_in[i] * (1 - out_in[i]) * w_out[i] * res * (1 - res) * (real - res) * net_in
                # 阈值调整
                delta_w_mid[2, i] = -yita * out_in[i] * (1 - out_in[i]) * w_out[i] * res * (1 - res) * (real - res)
            w_mid = w_mid + delta_w_mid
        Err[it] = err.mean()
    plt.plot(Err)
    plt.show()

    # 存储预测误差
    err_te = np.zeros([100])

    # 预测样本100个
    for j in range(100):
        net_in[:2] = data_te[j, :2]                         # 存储数据
        real = data_te[j, 2]                                # 真实结果

        # net_in和w_mid的相乘过程
        for i in range(4):
            # 输入层到隐层的传输过程
            out_in[i] = sigmoid(sum(net_in*w_mid[:, i]))
        res = sigmoid(sum(out_in*w_out))                    # 网络预测结果输出
        err_te[j] = abs(real-res)                           # 预测误差
        print('res:', res, ' real:', real)
    
    plt.plot(err_te)
    plt.show()




if "__main__" == __name__:

    # 1.读取样本
    data_tr = pd.read_csv("5.2 data_tr.txt")
    data_te = pd.read_csv("5.2 data_te.txt")
    BP(data_tr, data_te, maxiter=600)

4.数据格式

训练集、测试集下载链接见置顶评论:

https://download.csdn.net/download/admin_maxin/19844122

  • 103
    点赞
  • 934
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 64
    评论
当然可以,BP神经网络是目前应用广泛的一种神经网络。以下是一个简单的Python代码实现BP神经网络的示例: ```python import numpy as np # 定义sigmoid函数 def sigmoid(x): return 1.0/(1.0+np.exp(-x)) # 定义BP神经网络类 class BPNN: # 初始化 def __init__(self, input_dim, hidden_dim, output_dim): self.input_dim = input_dim self.hidden_dim = hidden_dim self.output_dim = output_dim self.W1 = np.random.randn(input_dim,hidden_dim) self.b1 = np.random.randn(hidden_dim) self.W2 = np.random.randn(hidden_dim,output_dim) self.b2 = np.random.randn(output_dim) # 前向传播 def forward(self, X): net_hidden = np.dot(X, self.W1) + self.b1 output_hidden = sigmoid(net_hidden) net_output = np.dot(output_hidden, self.W2) + self.b2 output = sigmoid(net_output) return output, output_hidden # 反向传播 def backward(self, X, Y, output, output_hidden, lr): error_output = (Y - output) * output * (1 - output) error_hidden = np.dot(error_output, self.W2.T) * output_hidden * (1 - output_hidden) self.W2 += lr * np.dot(output_hidden.T, error_output) self.b2 += lr * np.sum(error_output, axis=0) self.W1 += lr * np.dot(X.T, error_hidden) self.b1 += lr * np.sum(error_hidden, axis=0) # 训练 def train(self, X, Y, lr, epochs): for i in range(epochs): output, output_hidden = self.forward(X) self.backward(X, Y, output, output_hidden, lr) # 预测 def predict(self, X): output, _ = self.forward(X) return output ``` 以上代码实现了一个简单的三层BP神经网络,采用sigmoid函数作为激活函数,提供了初始化权重和偏差、前向传播、反向传播、训练等方法。你可以通过实例化`BPNN`类,传入输入层、隐藏层、输出层的维度,来构建一个BP神经网络。然后,通过传入训练数据和标签,设定学习率和迭代次数,来训练该神经网络。最后,可以通过调用`BPNN`的`predict()`方法,传入测试数据,来进行预测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 64
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博士僧小星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值