bpnn实现

#!/usr/bin/env python
#coding=utf-8
#BP神经网络模型实现
#作者:Xingo_z
#BP神经网络原理:http://www.hankcs.com/ml/back-propagation-neural-network.html
import math
import random
random.seed(0)

def rand(a,b):
	"""
	生成一个(a,b)范围内的随机数
	"""
	return (b-a)*random.random()+a
def makeMatrix(m,n,fill=0.0):
	"""
	创建矩阵,行数为:m,列数为:n
	填充 0.0
	"""
	res=[]
	for x in range(m):
		res.append([fill]*n)
	return res
def randomMatrix(matrix,a,b):
	"""
	随机初始矩阵
	"""
	for i in range(len(matrix)):
		for j in range(len(matrix[0])):
			matrix[i][j]=random.uniform(a,b)
def sigmoid(x):
	"""
	BP神经网络使用的激励函数:单极性神经网络
	f(x)=1/(1+exp(-x))
	"""
	return 1.0/(1.0+math.exp(-x))
def dsigmoid(y):
	"""
	单极性sigmoid激励函数的求导结果
	"""
	return y*(1-y)

class BPnn:
	"""
	BP神经网络的具体实现
	BP神经网络分为三层:输入层、隐藏层、输出层
	ni:输入层节点个数,
	nh:隐藏层节点个数
	no:输出节点个数
	"""
	def __init__(self,ni,nh,no):
		#输入的节点数 需要多加一个偏置节点
		self.ni=ni+1 
		self.nh=nh
		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)

		#随机化权重
		randomMatrix(self.wi,-0.2,0.2)
		randomMatrix(self.wo,-2.0,2.0)

		#权重矩阵的上次梯度
		self.ci=makeMatrix(self.ni,self.nh)
		self.co=makeMatrix(self.nh,self.no)

	def run(self,inputs):
		"""
		前向传播
		"""
		if len(inputs)!=self.ni-1:
			print "incorrect number of inputs!"
		#输入值等于x_i
		for i in range(self.ni-1):
			self.ai[i]=inputs[i]
		#得到隐藏层节点值
		for j in range(self.nh):
			sum=0.0
			for x in range(self.ni):
				sum+=(self.wi[x][j]*self.ai[x])
			self.ah[j]=sigmoid(sum)
		#得到输出节点值
		for k in range(self.no):
			sum=0.0
			for x in range(self.nh):
				sum+=(self.ah[x]*self.wo[x][k])
			self.ao[k]=sigmoid(sum)
		return self.ao
	def bp(self,target,N,M):
		"""
		反向传播算法,从输出层开始
		"""
		#输出层delta
		out_delta=[0.0]*self.no
		for x in range(self.no):
			error=target[x]-self.ao[x]
			out_delta[x]=error*dsigmoid(self.ao[x])
		#更新输出权值矩阵
		for j in range(self.nh):
			for k in range(self.no):
				change=out_delta[k]*self.ah[j]
				self.wo[j][k]+=N*change+M*self.co[j][k]
				self.co[j][k]=change
		#隐藏层delta
		hidden_delta=[0.0]*self.nh
		for x in range(self.nh):
			error=0.0
			for j in range(self.no):
				error+=out_delta[j]*self.wo[x][j]
			hidden_delta[x]=error*dsigmoid(self.ah[x])
		#更新隐藏层权值矩阵
		for i in range(self.ni):
			for j in range(self.nh):
				change=hidden_delta[j]*self.ai[i]
				self.wi[i][j]+=N*change+M*self.ci[i][j]
				self.ci[i][j]=change
		#计算总误差
		error=0.0
		for x in range(len(target)):
			error=0.5*(target[x]-self.ao[k])**2
		return error
	def weight(self):
		"""
		打印权值矩阵
		"""
		print "输入权值矩阵:"
		for i in range(self.ni):
			print self.wi[i]
		print "输出权值矩阵:"
		for x in range(self.nh):
			print self.wo[i]
	def test(self,patterns):
		"""
		测试文件
		"""
		for p in patterns:
			input=p[0]
			print 'Input:',p[0],'--->',self.run(input),'\ttarget',p[1]
	def train(self,patterns,max_iterations=1000,N=0.5,M=0.1):
		"""
		训练
		"""
		for i in range(max_iterations):
			for p in patterns:
				input=p[0]
				target=p[1]
				self.run(input)
				error=self.bp(target,N,M)
			if i%50==0:
				print "Combined error",error
		self.test(patterns)
def main():
	pat=[
	[[0,0],[1]],
	[[0,1],[1]],
	[[1,0],[1]],
	[[1,1],[0]]
	]
	myNN=BPnn(2,2,1)
	myNN.train(pat)
	myNN.test([[[2,1],[1]]])
if __name__ == '__main__':
	main()
		

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值