机器学习—人工神经网络
作者:互联网
人工神经网络是由大量处理单元互联组成的非线性、自适应信息处理系统。它是在现代神经科学研究成果的基础上提出的,试图通过模拟大脑神经网络处理、记忆信息的方式进行信息处理
1.从输入层到隐藏层
import pandas as pd
import numpy as np
def sigmoid(x): #网络激活函数
return 1/(1+np.exp(-x))
data_tr=pd.read_csv('BPdata_tr.txt')
#网络结构搭建
net_in=np.array([0.0499853495508432,0.334657078469172,-1]) # 网络输入
out_in=np.array([0,0,0,0,0,-1]) # 输出层的输入
w_mid=np.zeros([3,4]) #隐层神经元的权值&阈值
w_out=np.zeros([5]) #输出层神经元的权值&阈值
for i in range(4):
out_in[i]=sigmoid(sum(net_in*w_mid[:,i]))
2.网络输出
import pandas as pd
import numpy as np
def sigmoid(x): #网络激活函数
return 1/(1+np.exp(-x))
data_tr=pd.read_csv('BPdata_tr.txt')
#网络结构搭建
net_in=np.array([0.0499853495508432,0.334657078469172,-1]) # 网络输入
out_in=np.array([0,0,0,0,0,-1]) # 输出层的输入
real=0.114493895339242
w_mid=np.zeros([3,4]) #隐层神经元的权值&阈值
w_out=np.zeros([5]) #输出层神经元的权值&阈值
for i in range(4):
out_in[i]=sigmoid(sum(net_in*w_mid[:,i]))
pre=sigmoid(sum(out_in*w_out))
3.单样本网络训练
import pandas as pd
import numpy as np
def sigmoid(x): #网络激活函数
return 1/(1+np.exp(-x))
data_tr=pd.read_csv('BPdata_tr.txt')
yita=0.5
#网络结构搭建
net_in=np.array([0.0499853495508432,0.334657078469172,-1]) # 网络输入
out_in=np.array([0.0,0,0,0,-1]) # 输出层的输入
real=0.114493895339242
w_mid=np.zeros([3,4]) #隐层神经元的权值&阈值
w_out=np.zeros([5]) #输出层神经元的权值&阈值
delta_w_out=np.zeros([5]) #输出层权值&阈值的修正量
delta_w_mid=np.zeros([3,4]) #中间层权值&阈值的修正量
for it in range(100):
for i in range(4):
out_in[i]=sigmoid(sum(net_in*w_mid[:,i])) #从输入到隐层的传输过程
res=sigmoid(sum(out_in*w_out)) #模型预测值
print(it,'次训练的模型输出',res,'real',real)
delta_w_out=yita*res*(1-res)*(real-res)*out_in #输出层权值的修正量
delta_w_out[4]=-yita*res*(1-res)*(real-res) #输出层阈值的修正量
w_out=w_out+delta_w_out
for i in range(4):
delta_w_mid[:,i]=yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res)*net_in #中间层神经元的权值修正量
delta_w_mid[2, i] = -yita * out_in[i] * (1 - out_in[i]) * w_out[i] * res * (1 - res) * (real - res) #中间层神经元的阈值修正量
w_mid=w_mid+delta_w_mid #更新
4.全样本网络训练
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x): #网络激活函数
return 1/(1+np.exp(-x))
data_tr=pd.read_csv('BPdata_tr.txt') #训练集样本
yita=0.5
#网络结构搭建
out_in=np.array([0.0,0,0,0,-1]) # 输出层的输入
w_mid=np.zeros([3,4]) #隐层神经元的权值&阈值
w_out=np.zeros([5]) #输出层神经元的权值&阈值
delta_w_out=np.zeros([5]) #输出层权值&阈值的修正量
delta_w_mid=np.zeros([3,4]) #中间层权值&阈值的修正量
#便于绘制误差变化
err=[]
for j in range(100): #控制训练轮数
error=[]
for it in range(500):
net_in = np.array([data_tr.iloc[it,0],data_tr.iloc[it,1], -1]) # 网络输入
real = data_tr.iloc[it,2]
for i in range(4):
out_in[i]=sigmoid(sum(net_in*w_mid[:,i])) #从输入到隐层的传输过程
res=sigmoid(sum(out_in*w_out)) #模型预测值
error.append(abs(real-res))
print(it,'个样本训练的模型输出',res,'real',real)
delta_w_out=yita*res*(1-res)*(real-res)*out_in #输出层权值的修正量
delta_w_out[4]=-yita*res*(1-res)*(real-res) #输出层阈值的修正量
w_out=w_out+delta_w_out
for i in range(4):
delta_w_mid[:,i]=yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res)*net_in #中间层神经元的权值修正量
delta_w_mid[2, i] = -yita * out_in[i] * (1 - out_in[i]) * w_out[i] * res * (1 - res) * (real - res) #中间层神经元的阈值修正量
w_mid=w_mid+delta_w_mid #更新
err.append(np.mean(error))
plt.plot(err) #绘制误差变化线
plt.show()
5.网络性能评价
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x): #网络激活函数
return 1/(1+np.exp(-x))
data_tr=pd.read_csv('BPdata_tr.txt') #训练集样本
data_te=pd.read_csv('BPdata_te.txt') #测试集样本
yita=0.85
#网络结构搭建
out_in=np.array([0.0,0,0,0,-1]) # 输出层的输入
w_mid=np.zeros([3,4]) #隐层神经元的权值&阈值
w_out=np.zeros([5]) #输出层神经元的权值&阈值
delta_w_out=np.zeros([5]) #输出层权值&阈值的修正量
delta_w_mid=np.zeros([3,4]) #中间层权值&阈值的修正量
#便于绘制误差变化
err=[]
for j in range(1000): #控制训练轮数
error=[]
for it in range(500):
net_in = np.array([data_tr.iloc[it,0],data_tr.iloc[it,1], -1]) # 网络输入
real = data_tr.iloc[it,2]
for i in range(4):
out_in[i]=sigmoid(sum(net_in*w_mid[:,i])) #从输入到隐层的传输过程
res=sigmoid(sum(out_in*w_out)) #模型预测值
error.append(abs(real-res))
print(it,'个样本训练的模型输出',res,'real',real)
delta_w_out=yita*res*(1-res)*(real-res)*out_in #输出层权值的修正量
delta_w_out[4]=-yita*res*(1-res)*(real-res) #输出层阈值的修正量
w_out=w_out+delta_w_out
for i in range(4):
delta_w_mid[:,i]=yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res)*net_in #中间层神经元的权值修正量
delta_w_mid[2, i] = -yita * out_in[i] * (1 - out_in[i]) * w_out[i] * res * (1 - res) * (real - res) #中间层神经元的阈值修正量
w_mid=w_mid+delta_w_mid #更新
err.append(np.mean(error))
plt.plot(err) #绘制误差变化线
plt.show()
plt.close()
#将测试集样本放入训练好的网络中去
error_te = []
for it in range(len(data_te)):
net_in = np.array([data_te.iloc[it, 0], data_te.iloc[it, 1], -1]) # 网络输入
real = data_te.iloc[it, 2]
for i in range(4):
out_in[i] = sigmoid(sum(net_in * w_mid[:, i])) # 从输入到隐层的传输过程
res = sigmoid(sum(out_in * w_out)) # 模型预测值
error_te.append(abs(real - res))
plt.plot(error_te) #绘制误差变化线
plt.show()
6.使用sklearn实现神经网络
from sklearn.neural_network import MLPRegressor
import pandas as pd
import numpy as np
#调用sklearn实现神经网络算法
data_tr=pd.read_csv('BPdata_tr.txt') #训练集样本
data_te=pd.read_csv('BPdata_te.txt') #测试集样本
model=MLPRegressor(hidden_layer_sizes=(10,),random_state=10,max_iter=800,learning_rate_init=0.3) #构建模型
model.fit(data_tr.iloc[:,:2],data_tr.iloc[:,2]) #模型训练
pre=model.predict(data_te.iloc[:,:2]) #模型预测
err=np.abs(pre-data_te.iloc[:,2]).mean() #模型预测误差
print(err)
7.参考文章
【创作不易,望点赞收藏,若有疑问,请留言,谢谢】
标签:real,机器,res,mid,人工神经网络,学习,delta,np,out 来源: https://www.cnblogs.com/dongxuelove/p/16434221.html