2022年 11月 9日

标准BP算法用Python编程实现

1.需要导入两个模块

import pandas as pd
import numpy as np
  • 1
  • 2

2.定于激活函数

def sigmoid(x):
    return 1/(1+np.exp(-x))
  • 1
  • 2

3.标准BP算法


def BP(x_train,y_train,numb,inta): #x_train,y_train表示训练集,numb表示隐层神经元的个数,inta表示学习率
    #print('x_train:',x_train)
    #print('y_train:',y_train)
    v=np.matrix(np.random.rand(len(x_train.T),numb)) #随机生成输入层神经元与隐层神经元之间的连接权
    #print('v:',v)
    w=np.matrix(np.random.rand(numb,len(y_train.T))) #随机生成隐层神经元与输出层神经元之间的连接权
    #print('w:',w)
    thita=np.matrix(np.random.rand(len(y_train.T)))   #输出神经元的阈值
    #print("thita:",thita)
    garma=np.matrix(np.random.rand(numb))   #输出神经元的阈值
    #print("garma:",garma)
    temp=0
    for i in range(len(x_train)):
        alpha=x_train[i].dot(v)#隐层神经元的输入
        #print('alpha',alpha)
        b=sigmoid(alpha) #隐层神经元的输出
        #print('b',b)
        beta=b.dot(w)     #输出神经元的输入
        #print('beta',beta)
        y_estimate=sigmoid(beta-thita)   #求出y的估计值
        #print('y_estimate',y_estimate)
        g=y_estimate.dot((1-y_estimate).T).dot(y_train[i]-y_estimate)  #输出层神经元的梯度
        #print('g',g)
        e=b.dot((1-b).T).dot(g).dot(w.T)   #隐层神经元的梯度
        #print('e',e)
        E=1/2*(y_estimate-y_train[i]).dot((y_estimate-y_train[i]).T)  #均方误差
        #print('E',E)
        if E>temp:   #更新连接权和阈值
            w=w+inta*(b.T).dot(g)
            #print('w',w)
            thita=thita-inta*g
            #print('thita',thita)
            v=v+inta*(x_train[i].T).dot(e)
            #print('v',v)
            garma=garma-inta*e  #隐层神经元的阈值
            #print('garma',garma)
            temp=E

    return w,v,thita,garma
    
    
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

**

示例:

**随机生成训练集x与y

x=np.matrix(np.random.rand(3,4)) #输入层:随机生成3个样本,每个样本有4个神经元
y=np.matrix(np.random.rand(3,2)) #输出层:随机生成3个样本,每个样本有2个神经元
print('x',x)
print('y',y)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
调用BP函数

w,v,thita,garma=BP(x,y,4,0.01)#这里我假设隐层有4个神经元,学习率为0.01
print('w',w)
print('v',v)
print('thita',thita)
print('garma',garma)
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述