python自编BP神经网络

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)

猜你喜欢

转载自blog.csdn.net/spartanfuk/article/details/82180414