python实现BP算法

误差逆传播算法,又称BP算法,被誉为神经网络中最好的算法,其广泛应用在多层网络中。
在这之前,我们先来理解几个概念

M-P神经元模型

所谓M-P模型,其实是按照生物神经元的结构和工作原理构造出来的一个抽象和简化了的模型。
对于第 j 个神经元,接受多个其它神经元的输入信号xi 。各突触强度以实系数w表示,这是第i个神经元对第 j 个神经元作用的加权值。

在这里插入图片描述

多层神经网络结构

在这里插入图片描述

学习率

在这里插入图片描述

import pandas as pd
import numpy as np
def sigmoid(x):
    return 1/(1+np.exp(-x))


def BP(x_train, y_train, numb, inta):  # x_train,y_train表示训练集,numb表示隐层神经元的个数,inta表示学习率
	# print('x_train:',x_train)
	# print('y_train:',y_train)
	v = np.matrix(np.random.rand(len(x_train.T), numb))  # 随机生成输入层神经元与隐层神经元之间的连接权
	# print('v:',v)
	w = np.matrix(np.random.rand(numb, len(y_train.T)))  # 随机生成隐层神经元与输出层神经元之间的连接权
	# print('w:',w)
	thita = np.matrix(np.random.rand(len(y_train.T)))  # 输出神经元的阈值
	# print("thita:",thita)
	garma = np.matrix(np.random.rand(numb))  # 输出神经元的阈值
	# print("garma:",garma)
	temp = 0
	for i in range(len(x_train)):
		alpha = x_train[i].dot(v)  # 隐层神经元的输入
		# print('alpha',alpha)
		b = sigmoid(alpha)  # 隐层神经元的输出
		# print('b',b)
		beta = b.dot(w)  # 输出神经元的输入
		# print('beta',beta)
		y_estimate = sigmoid(beta - thita)  # 求出y的估计值
		# print('y_estimate',y_estimate)
		g = y_estimate.dot((1 - y_estimate).T).dot(y_train[i] - y_estimate)  # 输出层神经元的梯度
		# print('g',g)
		e = b.dot((1 - b).T).dot(g).dot(w.T)  # 隐层神经元的梯度
		# print('e',e)
		E = 1 / 2 * (y_estimate - y_train[i]).dot((y_estimate - y_train[i]).T)  # 均方误差
		# print('E',E)
		if E > temp:  # 更新连接权和阈值
			w = w + inta * (b.T).dot(g)
			# print('w',w)
			thita = thita - inta * g
			# print('thita',thita)
			v = v + inta * (x_train[i].T).dot(e)
			# print('v',v)
			garma = garma - inta * e  # 隐层神经元的阈值
			# print('garma',garma)
			temp = E

	return w, v, thita, garma

x=np.matrix(np.random.rand(3,4)) #输入层:随机生成3个样本,每个样本有4个神经元
y=np.matrix(np.random.rand(3,2)) #输出层:随机生成3个样本,每个样本有2个神经元
print('x',x)
print('y',y)


w,v,thita,garma=BP(x,y,4,0.01)#这里我假设隐层有4个神经元,学习率为0.01
print('w',w)
print('v',v)
print('thita',thita)
print('garma',garma)





在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭祥.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值