发布于2019-10-11 15:04 阅读(1709) 评论(0) 点赞(6) 收藏(1)
import math
import random
import pandas as pd
random.seed(0)
def rand(a,b):
return (b-a)*random.random()+a
def dsigmoid(x):
return x*(1-x)
def sigmoid(gamma):
if gamma < 0:
return 1 - 1/(1 + math.exp(gamma))
else:
return 1/(1 + math.exp(-gamma))
def makematrix(I,J):
m = []
for i in range(I):
m.append([0.0]*J)#一维构造二维
return m
class BP:
''' 三层BP网络'''
def __init__(self,ni,nh,no):
self.ni=ni+1
self.nh=nh+1
self.no=no
self.ai=[1.0]*self.ni
self.ah=[1.0]*self.nh
self.ao=[1.0]*self.no
self.wi=makematrix(self.ni,self.nh)
self.wo=makematrix(self.nh,self.no)
for i in range(self.ni):
for j in range(self.nh):
self.wi[i][j]=rand(-2,2)
for i in range(self.nh):
for j in range(self.no):
self.wo[i][j]=rand(-2,2)
def Forward(self,input):
for i in range(self.ni-1):
self.ai=input
for i in range(self.nh):
sum=0.0
for j in range(self.ni-1):
#print(self.ai[j])
sum+=self.wi[j][i]*self.ai[j]
self.ah[i]=sigmoid(sum)
for i in range(self.no):
sum=0.0
for j in range(self.no):
sum+=self.wo[j][i]*self.ah[j]
self.ao[i]=sigmoid(sum)
return self.ao
def backward(self,tartget,lv):
rerror=0.0
outerror=[1.0]*self.no
for i in range(self.no):
error=tartget[i]-self.ao[i]
rerror=error
outerror[i]=dsigmoid(self.ao[i])*error
herror=[1.0]*self.nh
for i in range(self.nh):
error=0.0
for j in range(self.no):
error+=outerror[j]*self.wo[i][j]
herror[i]=dsigmoid(self.ah[i])*error
for i in range(self.nh):
for j in range(self.no):
change=outerror[j]*self.ah[i]
self.wo[i][j]=self.wo[i][j]+lv*change
for i in range(self.ni-1):
for j in range(self.nh):
change=herror[j]*self.ai[i]
self.wi[i][j]=self.wi[i][j]+lv*change
error = 0.0
error += 0.5 * rerror ** 2
return error
def train(self, patterns, iterations, lr=0.009):
# lr: 学习速率(learning rate)
for i in range(iterations):
error = 0.0
for p in patterns:
inputs = p[0]
targets = p[1]
#print(inputs, ",", p[1])
self.Forward(inputs)
error = error + self.backward(targets, lr)
if i%100==0:
print('error: %-.9f' % error)
def test(self,patterns):
count=0
for p in patterns:
target=p[1]
#print(target)
result=self.Forward(p[0])
index = result.index(max(result))
if index==0 and target==[1,0,0]:
count=count+1
elif index==1 and target==[0,1,0]:
count=count+1
elif index==2 and target==[0,0,1]:
count = count + 1
accuracy = float(count / len(patterns))
print('accuracy: %-.9f' % accuracy)
def iris():
data=[]
raw=pd.read_csv('iris.csv')
raw_data=raw.values
raw_feature=raw_data[:,1:6]
print(raw_feature)
for i in range(len(raw_feature)):
ele=[]
ele.append(raw_feature[i])
if raw_data[i][5]=='setosa':
ele.append([1,0,0])
elif raw_data[i][5]=='versicolor':
ele.append([0,1,0])
else:
ele.append([0,0,1])
print(ele)
data.append(ele)
random.shuffle(data)
trainning=data[0:100]
test=data[101:]
nn=BP(4,7,3)
nn.train(data,10000)
nn.test(test)
if __name__ == '__main__':
iris()
作者:加班是一种习惯
链接:https://www.pythonheidong.com/blog/article/134405/db9e98512dff64e8ae96/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!