赞
踩
BP神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。
目录
优点:
- 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.数据压缩
网络训练的目标:找到合适的权值和阈值,使得误差E最小。
sigmoid函数:在信息科学当中,由于其单增以及其反函数单增等性质,sigmoid函数常被用作神经网络的阈值函数,将变量映射当0和1之间。(该函数的对x的求导也应该理解)
Xi: 输入信号。
Xd: 隐层的阈值(是从求和函数中-θ中分离出的-1)。
Vih: 第h个隐层神经元所对应输入信号Xi的权值。
αh: 第h个隐层神经元的输入。
-γh=--1*γh:隐层神经元的阈值。
bh: 第h个隐层神经元的输入。
ωhj: 第j个输出层神经元所对应的隐层神经元输出bh的权值。
-θj=-1*θj: 输出层神经元的阈值(bq)
:第j个输出层神经元的输出(预测输出值,yj为真实值)
通过公式变换可得输出层权值与阈值的变化量:
同理可得隐层权值和阈值的变化量:
- def sigmoid(x):
- """
- 隐含层和输出层对应的函数法则
- """
- return 1/(1+np.exp(-x))
- 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)
训练集、测试集下载链接见置顶评论:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。