BP神经网络的小模型
import numpy as np
import pandas as pd
import random
def sig(x):
return x/(1+np.abs(x))
def dsig(x):
return 1/(np.abs(x)+1)**2
def rsig(x):
return x/(1-x)
W=[0,-1.0,1.0]
def GetRan(n,m):
return ((6**0.5)/((n+m)**0.5))*W[random.randint(1,2)]
A=pd.read_csv("DataProductionSum.csv")
A=A.values
sum_RES=A[:,6]
sum_X=A[:,:6]
sum_X=sum_X[:,2:]
sum_RES=sum_RES.astype('float64')
sum_X=sum_X.astype('float64')
sum_RES=sum_RES[:,np.newaxis]
numTrain=15
X=sum_X[:numTrain,:]
Y=sum_RES[:numTrain,:]
Y=sig(Y.T)
X_test=sum_X[numTrain+1:,:]
Y_test=sum_RES[numTrain+1:,:]
Y_test=sig(Y_test.T)
midNum=[10,10]
sz=len(midNum)
xNum=X.shape[1]
yNum=Y.shape[0]
V=[]
t=np.random.random((xNum,midNum[0]))*GetRan(xNum,midNum[0])
V.append(t)
for i in range(1,sz):
t=np.random.random((midNum[i-1],midNum[i]))*GetRan(midNum[i-1],midNum[i])
V.append(t)
t=np.random.random((midNum[sz-1],yNum))*GetRan(midNum[sz-1],yNum)
V.append(t)
lr=0.0001
def updata():
global X,Y,V,lr,P,sz
L=[]
t=sig(np.dot(X,V[0]))
L.append(t)
for i in range(1,sz):
t=sig((np.dot(L[i-1],V[i])))
L.append(t)
t=sig((np.dot(L[sz-1], V[sz])))
L.append(t)
st=[]
L_delta=[]
top=0
t=(Y.T-L[sz])*dsig(L[sz])
st.append(t)
for i in range(sz-1,-1,-1):
t=t.dot(V[i+1].T)*dsig(L[i])
st.append(t)
top=len(st)
while top>0:
top=top-1
L_delta.append(st[top])
V_C=[]
t=lr*X.T.dot(L_delta[0])
V_C.append(t)
for i in range(1,sz+1):
t=lr*L[i-1].T.dot(L_delta[i])
V_C.append(t)
for i in range(0,sz+1):
V[i]=V[i]+V_C[i]
L=[]
t=sig(np.dot(X_test,V[0]))
L.append(t)
for i in range(1,sz):
t=sig((np.dot(L[i-1],V[i])))
L.append(t)
t=sig((np.dot(L[sz-1], V[sz])))
L.append(t)
print("Error of Pre:",np.mean(np.abs(Y_test-L[sz])))
for i in range(20000):
updata()
L=[]
t=sig(np.dot(X,V[0]))
L.append(t)
for i in range(1,sz):
t=sig((np.dot(L[i-1],V[i])))
L.append(t)
t=sig((np.dot(L[sz-1], V[sz])))
L.append(t)
print("Error of Train:",np.mean(np.abs(Y-L[sz])))
L=[]
t=sig(np.dot(X_test,V[0]))
L.append(t)
for i in range(1,sz):
t=sig((np.dot(L[i-1],V[i])))
L.append(t)
t=sig((np.dot(L[sz-1], V[sz])))
L.append(t)
print("Error of Test:",np.mean(np.abs(Y_test-L[sz])))