標準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://www.uj5u.com/houduan/275795.html
標籤:python
上一篇:一元線性模型的中位數回歸
