学习笔记413—python实现BP神经网络进行预测和误差分析(附源代码)

发布时间 2023-08-27 13:15:09作者: 何弈

python实现BP神经网络进行预测和误差分析(附源代码)

反向传播算法也称为BP神经网络,是一种带有反馈的神经网络反向学习方法,它可以对神经网络的各层上的各个神经元的各个神经元之间的连接权重进行不断迭代修改,使神经网络将输入数据转换成期望的输出数据

 

BP神经网络的学习过程由正向传播和反向传播两部分组成,正向传播完成通常的前向计算,由输入数据运算得到输出结果。反向传播的方向则相反,是将计算得到的误差回送,逐层传递误差调整神经网络的各个权值,然后神经网络再次进行前向运算,直到神经网络的输出达到期望的误差要求

 

 问题描述:神经网络的输入为3和6 期待的输出分别为0和1 输入层到隐藏层的初始权重依次为:w11=0.11,w12=0.12,w13=0.13,w14=0.14,w15=0.15,w16=0.16,

 

截距为0.3,隐藏层到输出层的初始权重为 w21=0.17,w22=0.18,w23=0.19,w24=0.20,w25=0.21,w23=0.22截距为0.6

 

使用BP神经网络算法 迭代调整得到合适的权重,并查看不同迭代次数下的误差结果,神经网络的学习率设置为0.3

 

输入结果如下:

 

代码如下 需要根据自己的模型修改参数和输入数据

import  numpy as np

import  matplotlib.pyplot as plt

from pylab import mpl

# 设置显示中文字体

import matplotlib; matplotlib.use('TkAgg')

mpl.rcParams["font.sans-serif"] = ["SimHei"]

matplotlib.rcParams['font.family'] = 'SimHei'

matplotlib.rcParams['font.size'] = 10

matplotlib.rcParams['axes.unicode_minus']=False

def sigmoid(x):

    return 1/(1+np.exp(-x))

#前向计算

def forward_NN(x,w,b):

    h1=sigmoid(w[0]*x[0]+w[1]*x[1]+b[0])

    h2=sigmoid(w[2]*x[0]+w[3]*x[1]+b[0])

    h3=sigmoid(w[4]*x[0]+w[5]*x[1]+b[0])

    print(h1,h2,h3)

    o1=sigmoid(w[6]*h1+w[8]*h2+w[10]*h3+b[1])

    o2=sigmoid(w[7]*h1+w[9]*h2+w[11]*h3+b[1])

    return h1,h2,h3,o1,o2

#反向传递 调整参数

def fit(o1,o2,y,x,w,lrate,epochs):

    for i in range(epochs):

  #循环迭代 调整参数

        p1=lrate*(o1-y[0])*o1*(1-o1)

        p2 = lrate * (o2 - y[1]) * o2 * (1 - o2)

        w[0]=w[0]-(p1*w[6]+p2*w[7]*h1*(1-h1)*x[0])

        w[1] = w[1] - (p1 * w[6] + p2 * w[7] * h1 * (1 - h1) * x[1])

        w[2] = w[2] - (p1 * w[8] + p2 * w[9] * h2 * (1 - h2) * x[0])

        w[3] = w[3] - (p1 * w[8] + p2 * w[9] * h2 * (1 - h1) * x[1])

        w[4] = w[4] - (p1 * w[10] + p2 * w[11] * h3 * (1 - h3) * x[0])

        w[5] = w[5] - (p1 * w[10] + p2 * w[11] * h3 * (1 - h3) * x[1])

        w[6]=w[6]-p1*h1

        w[7] = w[7] - p2 * h1

        w[8] = w[8] - p1 * h2

        w[9] = w[9] - p2 * h2

        w[10] = w[10] - p1 * h3

        w[11] = w[11] - p2 * h3

    return w

print("步骤一 初始化参数")

x=[3,6]

y=[0,1]

w=[0.6,0.61,0.62,0.63,0.64,0.65,0.66,0.67,0.68,0.69,0.70,0.71,0.72,0.73]

b=[0.3,0.6]

lrate=0.4

print("步骤二 fit")

print("步骤三 预测")

print("真值为",y)

sumDs=[]

for epochs in range(0,101,5):

    h1,h2,h3,o1,o2=forward_NN(x,w,b)

    w=fit(o1,o2,y,x,w,lrate,epochs)

    h1,h2,h3,o1,o2=forward_NN(x,w,b)

    print("迭代",epochs,"次的输出为\n",o1,o2)

    sumDs.append(o1-y[0]+(o2-y[1]))

print("画图")

plt.plot(range(0,101,5),sumDs)

plt.title("the epoch-error plot for 铅钡")

plt.xlabel("epochs")

plt.ylabel("totol error")

plt.show()

 参考链接:https://developer.aliyun.com/article/1056361