当前位置:主页 > 查看内容

标准BP算法、累积BP算法Python实现

发布时间:2021-06-24 00:00| 位朋友查看

简介:标准BP,累积BP算法原理及MATLAB自编写实现在这里 以下是自己编写的Python的代码,欢迎指正 标准BP算法: import numpy as npx np . matrix ( np . random . rand ( 3 , 2 ) ) #输入层 , 随机生成 3 个样本 , 每个样本有 4 个神经元y np . matrix ( np . random……

标准BP,累积BP算法原理及MATLAB自编写实现在这里

以下是自己编写的Python的代码,欢迎指正

标准BP算法:

import numpy as np

x=np.matrix(np.random.rand(3,2)) #输入层,随机生成3个样本,每个样本有4个神经元
y=np.matrix(np.random.rand(3,2)) #输出层,随机生成3个样本,每个样本有2个神经元
q=3
N=100000
k = 0.1

'''
q: 隐层单元数目
v: 输入层到隐层的权值
r: 隐层的阀值
w: 隐层到输出层的权值
h: 输出层的阀值
k: 学习率
'''

def fc_sigmod(x):
    return 1/(1+np.exp(-x))

def standard_BP(x0,y0,q,N,k):
    L=y0.shape[1]
    n=x0.shape[1]
    v=np.matrix(np.random.rand(n,q))
    r=np.matrix(np.random.rand(1,q))
    w=np.matrix(np.random.rand(q,L))
    h=np.matrix(np.random.rand(1,L))
    index=0
    y_hat = np.matrix(np.zeros((x0.shape[0],L)))
    iter=1
    while iter<N:
        A=np.dot(x[index],v)
        b=fc_sigmod(A-r)

        B=np.dot(b,w)
        # print(h)
        y_hat[index]=fc_sigmod(B-h)

        # E=0.5*np.dot(y[index]-y_hat[index],(y[index]-y_hat[index]).T)

        '以下对各个系数进行调整'
        g=np.multiply(np.multiply(y_hat[index],(1-y_hat[index])),y[index]-y_hat[index])
        e=np.multiply(np.multiply(b,(1-b)),(w*g.T).T)

        for i in range(n):
            for j in range(q):
                v[i,j]=v[i,j]+k*e[0,j]*x[index,i]
        r=r-k*e

        for i in range(q):
            for j in range(L):
                w[i,j]=w[i,j]+k*g[0,j]*b[0,i]
        h=h-k*g
        if index>=x0.shape[0]-1:
            index=index-x0.shape[0]+1
        index = index +1
        iter=iter+1
    print('输入层到隐层的权值为:')
    print(v)
    print('隐层的阀值为:')
    print(r)
    print('隐层到输出层的权值为:')
    print(w)
    print('输出层的阀值为:')
    print(h)
    print('样本y的值')
    print(y)
    print('训练后能得到y_hat的值')
    print(y_hat)

standard_BP(x,y,q,N,k)

在这里插入图片描述
我们看到训练后预测的y_hat值与原先的已经比较接近了。当然这里的标准BP算法实现比较简单~

累积BP算法:

import numpy as np

x=np.matrix(np.random.rand(3,2)) #输入层,随机生成3个样本,每个样本有4个神经元
y=np.matrix(np.random.rand(3,2)) #输出层,随机生成3个样本,每个样本有2个神经元
q=3
N=50000
k = 0.1

'''
q: 隐层单元数目
v: 输入层到隐层的权值
r: 隐层的阀值
w: 隐层到输出层的权值
h: 输出层的阀值
k: 学习率
'''

def fc_sigmod(x):
    return 1/(1+np.exp(-x))

def acc_BP(x,y,q,N,k):
    L=y.shape[1]
    n=x.shape[1]
    v=np.matrix(np.random.rand(n,q))
    r=np.matrix(np.random.rand(1,q))
    w=np.matrix(np.random.rand(q,L))
    h=np.matrix(np.random.rand(1,L))
    b=np.matrix(np.zeros((x.shape[0],q)))
    g=np.matrix(np.zeros((x.shape[0],n)))
    e=np.matrix(np.zeros((x.shape[0],q)))

    y_hat = np.matrix(np.zeros((x.shape[0],L)))
    iter=1
    while iter<N:
        for index in range(x.shape[0]):
            A=np.dot(x[index],v)
            b[index]=fc_sigmod(A-r)

            B = np.dot(b[index],w)
            y_hat[index]=fc_sigmod(B-h)

            g[index]=np.multiply(np.multiply(y_hat[index],(1-y_hat[index])),y[index]-y_hat[index])
            e[index]=np.multiply(np.multiply(b[index],(1-b[index])),(w*g[index].T).T)
        #以下对各个系数进行调整
        #对上述的一些系数调整至取均值
        b_bar=b.mean(axis=0)
        g_bar=g.mean(axis=0)
        e_bar=e.mean(axis=0)
        x_bar=x.mean(axis=0)

        for i in range(n):
            for j in range(q):
                v[i,j]=v[i,j]+k*e_bar[0,j]*x_bar[0,i]
        r=r-k*e_bar

        for i in range(q):
            for j in range(L):
                w[i,j]=w[i,j]+k*g_bar[0,j]*b_bar[0,i]
        h=h-k*g_bar
        iter=iter+1
    print('输入层到隐层的权值为:')
    print(v)
    print('隐层的阀值为:')
    print(r)
    print('隐层到输出层的权值为:')
    print(w)
    print('输出层的阀值为:')
    print(h)
    print('样本y的值')
    print(y)
    print('训练后能得到y_hat的值')
    print(y_hat)

acc_BP(x,y,q,N,k)

在这里插入图片描述
这里训练后得到的效果不是很好,和自己先前用Matlab写的累积BP算法一样,训练后得到的y_hat值不是很准确.要想获得更加准确的模型,可以考虑一下几个因素

  • 隐层和输出层的激活函数的选取(我们这里选取的都是sigmod函数)
  • 学习因子
  • 迭代次数
  • 增加隐层单元数目
  • 设置多隐层(我们这里只设置了一个隐层)
;原文链接:https://blog.csdn.net/mynameisgt/article/details/115644410
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐