其他分享
首页 > 其他分享> > 机器学习—人工神经网络

机器学习—人工神经网络

作者:互联网

人工神经网络是由大量处理单元互联组成的非线性、自适应信息处理系统。它是在现代神经科学研究成果的基础上提出的,试图通过模拟大脑神经网络处理、记忆信息的方式进行信息处理

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