BP神经网络(两种)

numpy方式

"""
Created on Tue Mar 8 14:40:31 2022

@author: ying
"""

import math
import numpy as np
import pandas as pd
from pandas import DataFrame


fp =open("C:/Users/ying/Desktop/3.3 data_te.txt","r");

def loaddataset():
#存放数据
dataset =[[] for i in range(150)]
#存放标签
labelset = []
l=0
for i in fp.readlines():
if("x1"not in i and i!=[]):
a = i.split(',')
#每个数据行的最后一个是标签
for j in range(0,2):
dataset[l].append((float)(a[j]))
dataset[l].append(-1)
labelset.append((float)(a[-1]))
l+=1
return dataset, labelset

 


def sigmoid(x):
return 1/(1+math.exp(-x))

'''
weight1:输入层与隐层的连接权重
weight2:隐层与输出层的连接权重
value1:隐层阈值
value2:输出层阈值
'''
def trainning(dataset, labelset,W_mid, W_out):
#中间层神经元输入和输出层神经元输入
Net_in = DataFrame(0.6,index=["input1","input2","theata"],columns=['a'])
Out_in=DataFrame(0,index=['input1','input2','input3','input4','theata'],columns=['a'])
Net_in.iloc[2,0] = -1
Out_in.iloc[4,0]=-1
#输入层与隐层的连接权重
W_mid=DataFrame(0.5,index=['input1','input2','theata'],columns=['mid1','mid2','mid3','mid4'])
#隐层与输出层的连接权重
W_out=DataFrame(0.5,index=['input1','input2','input3','input4','theata'],columns=['a'])

W_mid_delta=DataFrame(0,index=['input1','input2','theata'],columns=['mid1','mid2','mid3','mid4'])
W_out_delta=DataFrame(0,index=['input1','input2','input3','input4','theata'],columns=['a'])
#x为步长
yita = 0.01
for i in range(1,len(dataset)):
#输入数据
inputset = DataFrame(dataset[i],columns=['a'],index=["input1","input2","theata"])
#数据标签
real = DataFrame(labelset[i],columns=['a'],index=["real"])
#隐层输入
Net_in = inputset.mul(W_mid,axis=0)
#中间层的输出
for j in range(0,4):
Out_in.iloc[j,0] = sigmoid(sum(W_mid.iloc[:,j].mul(Net_in.iloc[:,0],axis=0)))
#输出层的输出/网络输出
res = sigmoid(sum(Out_in.iloc[:,0].mul(W_out.iloc[:,0],axis=0)))
error = abs(res-real)

#输出层权值变化量
W_out_delta.iloc[:] = yita*res*(1-res)*(real-res)*Out_in.iloc[:]
W_out_delta.iloc[4]=-(yita*res*(1-res)*(real-res))
W_out=W_out+W_out_delta
#中间层权值变化量
for i in range(0,4):
W_mid_delta.iloc[:,i]=yita*Out_in.iloc[i,0]*(1-Out_in.iloc[i,0])*W_out.iloc[i,0]*res*(1-res)*(real-res)*Net_in.iloc[:,0]
W_mid_delta.iloc[2,i]=-(yita*Out_in.iloc[i,0]*(1-Out_in.iloc[i,0])*W_out.iloc[i,0]*res*(1-res)*(real-res))
W_mid=W_mid+W_mid_delta#中间层权值更新
return W_mid, W_out


def testing(dataset, labelset, weight1, weight2):
#记录预测正确的个数
rightcount = 0
for i in range(1,len(dataset)):
#计算每一个样例通过该神经网路后的预测值
inputset = np.mat(dataset[i]).astype(np.float64)
outputset = np.mat(labelset[i]).astype(np.float64)
output2 = sigmoid(np.dot(inputset, weight1)-1)
output3 = sigmoid(np.dot(output2, weight2)-1)

#确定其预测标签
if output3 > 0.5:
flag = 1
else:
flag = 0
if labelset[i] == flag:
rightcount += 1
#输出预测结果
print("预测为%d 实际为%d"%(flag, labelset[i]))
#返回正确率
return rightcount / len(dataset)

if __name__ == '__main__':
dataset, labelset = loaddataset()
#输入层与隐层的连接权重
W_mid=DataFrame(0.5,index=['input1','input2','theata'],columns=['mid1','mid2','mid3','mid4'])
#隐层与输出层的连接权重
W_out=DataFrame(0.5,index=['input1','input2','input3','input4','theata'],columns=['a'])
for i in range(1500):
weight1, weight2= trainning(dataset, labelset,W_mid,W_out)
rate = testing(dataset, labelset, weight1, weight2)
print("正确率为%f"%(rate))

 

 

 //出结果了,可是正确率不行。。

 

 

DataFramef方式

import math
import numpy as np
import pandas as pd
from pandas import DataFrame


fp =open("C:/Users/ying/Desktop/3.3 data_te.txt","r");

def loaddataset():
#存放数据
dataset =[[] for i in range(150)]
#存放标签
labelset = []
l=0
for i in fp.readlines():
if("x1"not in i and i!=[]):
a = i.split(',')
#每个数据行的最后一个是标签
for j in range(0,2):
dataset[l].append((float)(a[j]))
dataset[l].append(-1)
labelset.append((float)(a[-1]))
l+=1
return dataset, labelset

 


def sigmoid(x):
return 1/(1+math.exp(-x))

'''
weight1:输入层与隐层的连接权重
weight2:隐层与输出层的连接权重
value1:隐层阈值
value2:输出层阈值
'''
def trainning(dataset, labelset,W_mid, W_out):
#中间层神经元输入和输出层神经元输入
Net_in = DataFrame(0.6,index=["input1","input2","theata"],columns=['a'])
Out_in=DataFrame(0,index=['input1','input2','input3','input4','theata'],columns=['a'])
Net_in.iloc[2,0] = -1
Out_in.iloc[4,0]=-1
#输入层与隐层的连接权重
W_mid=DataFrame(0.5,index=['input1','input2','theata'],columns=['mid1','mid2','mid3','mid4'])
#隐层与输出层的连接权重
W_out=DataFrame(0.5,index=['input1','input2','input3','input4','theata'],columns=['a'])

W_mid_delta=DataFrame(0,index=['input1','input2','theata'],columns=['mid1','mid2','mid3','mid4'])
W_out_delta=DataFrame(0,index=['input1','input2','input3','input4','theata'],columns=['a'])
#x为步长
yita = 0.01
for i in range(1,len(dataset)):
#输入数据
inputset = DataFrame(dataset[i],columns=['a'],index=["input1","input2","theata"])
#数据标签
real = DataFrame(labelset[i],columns=['a'],index=["real"])
#隐层输入
Net_in = inputset.mul(W_mid,axis=0)
#中间层的输出
for j in range(0,4):
Out_in.iloc[j,0] = sigmoid(sum(W_mid.iloc[:,j].mul(Net_in.iloc[:,0],axis=0)))
#输出层的输出/网络输出
res = sigmoid(sum(Out_in.iloc[:,0].mul(W_out.iloc[:,0],axis=0)))
error = abs(res-real)

#输出层权值变化量
W_out_delta.iloc[:-1] = yita*res*(1-res)*(real-res)*Out_in.iloc[:-2]
W_out_delta.iloc[4]=-(yita*res*(1-res)*(real-res))
W_out=W_out+W_out_delta
#中间层权值变化量
for i in range(0,4):
W_mid_delta.iloc[:,i]=yita*Out_in.iloc[i,0]*(1-Out_in.iloc[i,0])*W_out.iloc[i,0]*res*(1-res)*(real-res)*Net_in.iloc[:,0]
W_mid_delta.iloc[2,i]=-(yita*Out_in.iloc[i,0]*(1-Out_in.iloc[i,0])*W_out.iloc[i,0]*res*(1-res)*(real-res))
W_mid=W_mid+W_mid_delta#中间层权值更新
return W_mid, W_out


def testing(dataset, labelset, weight1, weight2):
#记录预测正确的个数
rightcount = 0
for i in range(1,len(dataset)):
#计算每一个样例通过该神经网路后的预测值
inputset = np.mat(dataset[i]).astype(np.float64)
outputset = np.mat(labelset[i]).astype(np.float64)
output2 = sigmoid(np.dot(inputset, weight1)-1)
output3 = sigmoid(np.dot(output2, weight2)-1)

#确定其预测标签
if output3 > 0.5:
flag = 1
else:
flag = 0
if labelset[i] == flag:
rightcount += 1
#输出预测结果
print("预测为%d 实际为%d"%(flag, labelset[i]))
#返回正确率
return rightcount / len(dataset)

if __name__ == '__main__':
dataset, labelset = loaddataset()
#输入层与隐层的连接权重
W_mid=DataFrame(0.5,index=['input1','input2','theata'],columns=['mid1','mid2','mid3','mid4'])
#隐层与输出层的连接权重
W_out=DataFrame(0.5,index=['input1','input2','input3','input4','theata'],columns=['a'])
for i in range(1500):
weight1, weight2= trainning(dataset, labelset,W_mid,W_out)
rate = testing(dataset, labelset, weight1, weight2)
print("正确率为%f"%(rate))

 

 //改了三天bug依然出错。。

 

孩子要哭了

posted @ 2022-03-19 16:39  周楚y  阅读(190)  评论(0)    收藏  举报