当前位置:   article > 正文

BP神经网络代码实现

bp神经网络代码

1.用sigmoid(x)函数激活:

其导数f'(x)=f(x)(1-f(x))

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. def sigmoid(x):
  5. return 1/(1+np.exp(-x))
  6. def BP(data_tr, data_te, maxiter=1000):
  7. data_tr, data_te = np.array(data_tr), np.array(data_te)
  8. net_in = np.array([0.0, 0, -1])
  9. out_in = np.array([0.0, 0, 0, 0, -1]) # 输出层的输入,即隐层的输出
  10. w_mid = np.random.rand(3, 4) # 隐层神经元的权值&阈值
  11. w_out = np.random.rand(5) # 输出层神经元的权值&阈值
  12. delta_w_out = np.zeros([5]) # 输出层权值&阈值的修正量
  13. delta_w_mid = np.zeros([3,4]) # 中间层权值&阈值的修正量
  14. yita = 1.75 # η: 学习速率
  15. Err = np.zeros([maxiter]) # 记录总体样本每迭代一次的错误率
  16. # 1.样本总体训练的次数
  17. for it in range(maxiter):
  18. # 衡量每一个样本的误差
  19. err = np.zeros([len(data_tr)])
  20. # 2.训练集训练一遍
  21. for j in range(len(data_tr)):
  22. net_in[:2] = data_tr[j, :2] # 存储当前对象前两个属性值
  23. real = data_tr[j, 2]
  24. # 3.当前对象进行训练
  25. for i in range(4):
  26. out_in[i] = sigmoid(sum(net_in*w_mid[:, i])) # 计算输出层输入
  27. res = sigmoid(sum(out_in * w_out)) # 获得训练结果
  28. err[j] = abs(real - res)
  29. # --先调节输出层的权值与阈值
  30. delta_w_out = yita*res*(1-res)*(real-res)*out_in # 权值调整
  31. delta_w_out[4] = -yita*res*(1-res)*(real-res) # 阈值调整
  32. w_out = w_out + delta_w_out
  33. # --隐层权值和阈值的调节
  34. for i in range(4):
  35. # 权值调整
  36. delta_w_mid[:, i] = yita * out_in[i] * (1 - out_in[i]) * w_out[i] * res * (1 - res) * (real - res) * net_in
  37. # 阈值调整
  38. delta_w_mid[2, i] = -yita * out_in[i] * (1 - out_in[i]) * w_out[i] * res * (1 - res) * (real - res)
  39. w_mid = w_mid + delta_w_mid
  40. Err[it] = err.mean()
  41. plt.plot(Err)
  42. plt.show()
  43. # 存储预测误差
  44. err_te = np.zeros([ len(data_te) ])
  45. # 预测样本len(data_te)个
  46. for j in range( len(data_te) ):
  47. net_in[:2] = data_te[j, :2] # 存储数据
  48. real = data_te[j, 2] # 真实结果
  49. # net_in和w_mid的相
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号