import numpy as np
import matplotlib.pyplot as plt
#避免中文乱码
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
#定义激活函数
def sigmoid(x):
return 1/(1 + np.exp(-x))
#BP神经网络
def bpnet(x = None,y = None,hidsize = 5,maxiter = None,yita = 0.05):
n,m = x.shape
net_in = -np.ones([m+1])
out_in = -np.ones([hidsize + 1])
w_mid = np.random.rand(m+1,hidsize) #初始隐层神经元的权值
w_out = np.random.rand(hidsize+1) #初始输出神经元的权值
delta_w_mid = np.zeros([m+1,hidsize]) #初始中间层权值的修正量
Error = np.zeros([maxiter])
for it in range(maxiter):
error = np.zeros([n])
for j in range(n):
net_in[:m] = x[j,:m] #更新网络输入值
real = y[j] #对应实际值
for i in range(hidsize):
out_in[i] = sigmoid(sum(net_in*w_mid[:,i]))
res = sigmoid(sum(out_in*w_out))#隐藏层到网络输出
#输出层权值修正
delta_w_out = yita*res*(1-res)*(real-res)*out_in
delta_w_out[hidsize] = -yita*res*(1-res)*(real-res)
w_out = w_out + delta_w_out
#中间层权值修正量
for i in range(hidsize):
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[m,i] = -yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res)
w_mid = w_mid + delta_w_mid
error[j] = abs(real-res)
Error[it] = error.mean()
print('第%s次迭代,误差是%s' % (it,Error[it]))
plt.plot(Error)
plt.xlabel('迭代次数')
plt.ylabel('误差')
plt.title('模型训练误差')
plt.show()
return w_mid,w_out
#####################测试
from sklearn.datasets import load_iris
dataset = load_iris()
data = dataset['data']
target = dataset['target']
w_mid,w_out = bpnet(x = data,y = target,maxiter = 100)
python自编BP神经网络
猜你喜欢
转载自blog.csdn.net/spartanfuk/article/details/82180414
今日推荐
周排行