十一、机器学习进阶知识:反向传播神经网络(BPNN)的实现(Python,附源码及数据集)

一、理论基础

反向传播神经网络(BPNN)是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,最常见结构为3层。
数据在神经网络中的训练过程可分为前向传播过程与反向传播过程。通过前向传递过程将数据输入网络,数据依次通过隐含层与输出层并进行相关计算,得到输出值与目标值之间的误差;然后在反向进行传递过程进行神经网络权值、阈值的调整,重复此过程,使得神经网络的输出结果不断逼近真实值。
常见的BP神经网络为3层,输入层、隐含层、输出层。其中输入层传入数据,然后在隐含层与输出层分别与权值、阈值进行计算、从而实现非线性变换,最后在输出层与目标值进行比较获取误差。

1、前向传播

前向传播过程中隐含层与输出层的输出公式及误差公式计算如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其中W与b为隐含层与输出层的权值和阈值,通过初始化生成,x为隐含层与输出层的输入数据,g为激活函数,h为输出,E为误差,y_i为目标值,y ̂_i为实际值。
参数初始化方法参考:
神经网络基础知识之参数初始化

2、反向传播

反向传播过程中输出层的误差项计算公式如下:
在这里插入图片描述
在这里插入图片描述

其中V与b_2为输出层的权值和阈值,E为损失函数。隐含层的误差项的计算公式可以此类推进行计算。
隐含层与输出层的权值和阈值的更新计算公式如下:
在这里插入图片描述
在这里插入图片描述
损失函数原理参考:
机器学习基础知识之损失函数
反向传播原理参考:
神经网络之反向传播算法(梯度、误差反向传播算法BP)

3、激活函数

在前向传播过程中,输入数据除了和隐含层、输出层的权值、阈值进行计算外,还会使用激活函数g对计算结果进行非线性计算。激活函数作为人工神经网络中神经元的核心,其作用在于将非线性因素引入神经元,它在输入传递至输出的过程中进行函数转换,以此将无限范围内的输入非线性变换为有限范围内的输出,一旦人工神经网络缺少激活函数,那么它每一层的数据传递过程就变成了单纯的矩阵计算过程,无论数据传递了多少层,最后的输出都是输入的线性组合。
常见的激活函数如下:
1、sigmod
Sigmod函数是一种常见的S型函数,它能够将输入变量映射到0到1之间,其公式如下:
在这里插入图片描述

2、Tanh
Tanh函数是一种双曲正切函数,它是由双曲正弦函数与双曲余弦函数推导而来,同样将输入处理成0到1之间,与sigmod不同的是它的输出是零中心的,其公式如下:
在这里插入图片描述

3、Relu
Relu函数将输入和零进行比较,输出较大值,其公式如下:
在这里插入图片描述

4、Leaky Relu
Leaky Relu函数和Relu函数不同的是,当输入小于零时,将输入与常量gamma进行计算作为输出,其公式如下:
在这里插入图片描述
激活函数对比及适用场景参考:
神经网络基础知识之激活函数

4、神经网络结构

BP神经网络的输入层和输出层层数通常需要根据实际问题进行确定,而隐含层的层数即节点数的确定,通常没有一个确定的方法,一般通过设置不同的节点数然后比较其网络训练结果来选择最优数量,而节点数的范围可通过以下公式进行确定:
在这里插入图片描述
在这里插入图片描述

其中h为隐含层单元数,n为输入层单元数,m为输出层单元数,a为1到10之间的常数。

二、BP神经网络的实现

以数据预测为例,下面介绍BP神经网络的实现过程。
选用某省市的表层土壤重金属元素数据集作为实验数据,该数据集总共96组,随机选择其中的24组作为测试数据集,72组作为训练数据集。选取重金属Ti的含量作为待预测的输出特征,选取重金属Co、Cr、Mg、Pb作为模型的输入特征。

1、训练过程(BPNN.py)

#库的导入
import numpy as np
import pandas as pd

#激活函数tanh
def tanh(x):
    return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))
#激活函数偏导数
def de_tanh(x):
    return (1-x**2)

#输入数据的导入
df = pd.read_csv("train.csv")
df.columns = ["Co", "Cr", "Mg", "Pb", "Ti"]
Co = df["Co"]
Co = np.array(Co)
Cr = df["Cr"]
Cr = np.array(Cr)
Mg=df["Mg"]
Mg=np.array(Mg)
Pb = df["Pb"]
Pb =np.array(Pb)
Ti = df["Ti"]
Ti = np.array(Ti)
samplein = np.mat([Co,Cr,Mg,Pb])
#数据归一化,将输入数据压缩至0到1之间,便于计算,后续通过反归一化恢复原始值
sampleinminmax = np.array([samplein.min(axis=1).T.tolist()[0],samplein.max(axis=1).T.tolist()[0]]).transpose()
sampleout = np.mat([Ti])
sampleoutminmax = np.array([sampleout.min(axis=1).T.tolist()[0],sampleout.max
  • 11
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论
BP神经网络是一种常用的人工神经网络,用于解决各种分类和预测问题。Python是一门流行的编程语言,它提供了一个灵活的环境,可以轻松地构建和实现BP神经网络。 在Python实现BP神经网络的代码可以分为三个主要部分:输入层、隐藏层和输出层。输入层用来接收数据,隐藏层用于处理数据并生成预测,输出层用于将预测结果输出。 以下是一个简单的BP神经网络Python代码实现: ``` python import numpy as np class BP: def __init__(self, in_dim, out_dim, hidden_dim): self.in_dim = in_dim self.out_dim = out_dim self.hidden_dim = hidden_dim self.weights1 = np.random.rand(self.in_dim, self.hidden_dim) self.biases1 = np.random.rand(self.hidden_dim) self.weights2 = np.random.rand(self.hidden_dim, self.out_dim) self.biases2 = np.random.rand(self.out_dim) def sigmoid(self, x): return 1/(1 + np.exp(-x)) def forward(self, X): self.Z1 = np.dot(X, self.weights1) + self.biases1 self.A1 = self.sigmoid(self.Z1) self.Z2 = np.dot(self.A1, self.weights2) + self.biases2 self.A2 = self.sigmoid(self.Z2) def derivative_sigmoid(self, x): return x*(1-x) def backward(self, X, y, lr): error = y - self.A2 delta2 = error*self.derivative_sigmoid(self.A2) self.weights2 += lr*np.dot(self.A1.T, delta2) self.biases2 += lr*np.sum(delta2, axis=0) delta1 = np.dot(delta2, self.weights2.T)*self.derivative_sigmoid(self.A1) self.weights1 += lr*np.dot(X.T, delta1) self.biases1 += lr*np.sum(delta1, axis=0) def train(self, X, y, lr=0.01, epochs=1000): for i in range(epochs): self.forward(X) self.backward(X, y, lr) def predict(self, X): self.forward(X) return self.A2 ``` 在上述Python代码中,我们通过使用NumPy库来创建一个BP神经网络。与其他神经网络相似,我们有一些参数,如输入维度,隐藏维度和输出维度等等。我们使用NumPy来生成随机权重和偏置。我们使用sigmoid函数作为激活函数。前向传递使用dot函数来计算权重和输入的乘积,使用sigmoid激活函数计算输出,反向传递使用误差来反向调整权重和偏差。在训练神经网络时,我们通过迭代来调整权重和偏差并降低误差。通过对BP神经网络的训练和预测,我们可以处理各种分类和预测问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

七层楼的疯子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值