python手推多层感知机(BP网络实现)
一.概念及应用
多层感知机(Multi Layer Perceptron, MLP)是由多个感知机层全连接组成的前馈神经网络,BP网络是指连接权调整采用了反向传播(Back Propagation)学习算法的前馈网络,可实现从输入到输出的非线性映射。
BP网络由前向传播与反向传播两个过程组成,前向传播是指由输入值预测输出值的过程,反向传播是指各输出层反向计算对损失函数的梯度进而迭代权重的过程。
BP网络可用于分类和回归问题,在回归问题中损失函数选取rmse等,在分类问题中损失函数选取交叉熵等,在输出层二分类问题选择sigmoid函数层进行映射,多分类问题选择softmax函数层进行映射。
二.python实现
导入所需库
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
数据准备与切分
X, ytrue = make_classification(n_samples=100, random_state=1)
X=np.hstack((X,np.ones([X.shape[0], 1])))#增加一列bias
X_train, X_test, y_train, y_test = train_test_split(X, ytrue,random_state=1)
前期准备函数
def sigmoid(z):return 1 / (1.0 + np.exp(-np.clip(z,-100,10000)))
def sigmoid_Derivative(h):return h*(1.0-h)#对应位置元素进行相乘,计算y的方差h(1-h)
BP类实现
整体思路:分别定义各层系数矩阵,向前传播计算输出值a,输入作为输出进行迭代;向后传播迭代参数
'''{param:ni:input数据维数nl:隐藏层数量(3)nh:每层隐藏层包含神经元数量(列表形式存储)[2,3,4]no:输出类别数}
'''class BP:#初始化神经网络def _init_(self,ni,nl,nh,no):self.input=niself.hidden=nhself.output=noself.layer=nl#系数矩阵,列表存储第几层,size[i,]表示前一层输入神经元(bias+1),size[,i]表示后一层输出神经元(bias不需输出) self.weight=[np.random.random(size=(i+1,o)) for i,o in zip([self.input]+self.hidden,self.hidden+[self.output]) ] #神经元存储输入输出self.cell_pre=[np.ones((pre+1,1)) for pre in [self.input]+self.hidden] #前馈神经网络def forward(self,x):self.cell_pre[0]=x.reshape((len(x),1))for i in range(len(self.cell_pre)-1):z=self.weight[i].T@self.cell_pre[i]o_new=sigmoid(z)self.cell_pre[i+1][:-1,0]=o_new.reshape(1,len( self.cell_pre[i+1][:-1,0]))#bias只输入不输出self.out_pre=sigmoid(self.weight[-1].T@self.cell_pre[-1])return self.cell_pre,self.weight#反向传播,根据链式法则计算,损失函数为交叉熵,先计算损失函数对输出层的梯度,而后向后传播def backward_propagate(self,x,y,alpha):out=self.forward(x) #最后一层
# sigma=(self.out_pre-y)*sigmoid_Derivative(self.out_pre[-1]) 损失函数为rmsesigma=self.out_pre-yself.weight[-1]-=alpha*(self.cell_pre[-1]@sigma)for j in range(1,len(self.cell_pre)):sigma=((self.weight[-j][:-1,]*sigmoid_Derivative(self.cell_pre[-j])[:-1,]))@sigma #bias项连接dropself.weight[-j-1]-=self.cell_pre[-j-1]@sigma.Treturn self.weightdef train(self,cases,label,limit,alpha):for l in range(limit):
# print('iterition:',l)for k in range(0,len(cases)):#训练方法采用随机梯度下降进行计算x = cases[k]y = label[k]self.weight=self.backward_propagate(x,y,alpha)return self.weightdef predict(self,cases):out=sigmoid(cases@self.weight[0])out=np.hstack((out,np.ones([out.shape[0],1])))for i in range(1,len(self.weight)): out=sigmoid(out@self.weight[i]) if i !=len(self.weight)-1:out=np.hstack((out,np.ones([out.shape[0],1])))return np.round(out)
调用
t=BP()
ni,nl,nh,no=20,4,[2,3,4,5],1
t._init_(ni,nl,nh,no)
w=t.train(X_train,y_train,500,0.01)
t.predict(X_train)
https://www.cnblogs.com/Finley/p/5946000.html
https://baike.baidu.com/item/%E5%89%8D%E9%A6%88%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/7580523?fr=aladdin
python手推多层感知机(BP网络实现)相关推荐
- 基于Python的BP网络实现手写数字识别
资源下载地址:https://download.csdn.net/download/sheziqiong/86790047 资源下载地址:https://download.csdn.net/downl ...
- python 底层实现_用Python从底层实现一个多层感知机
在上一篇文章中,我们从数学理论对多层感知机的反向传播进行了推导.南柯一梦宁沉沦:神经网络中反向传播算法数学推导zhuanlan.zhihu.com 这一篇文章中我们将基于上一篇文章最后给出的算法使用 ...
- (二十四) 手推BP神经网络的前向传播和反向传播
手推BP神经网络的前向传播和反向传播 一.基本术语 1.监督学习与非监督学习 Supervised Learning有监督式学习: 输入的数据被称为训练数据,一个模型需要通过一个训练过程,在这个过程中 ...
- 机器学习从零开始-常见算法手推pure python
简单线性回归 概念 简单线性回归代码 # 平均值函数 def calculate_mean(a_list_of_values):mean=sum(a_list_of_values)/float(len ...
- 基于Tensorflow实现多层感知机网络MLPs
正文共1232张图,1张图,预计阅读时间7分钟. github:https://github.com/sladesha/deep_learning 之前在基于Tensorflow的神经网络解决用户流失 ...
- BP算法总结+从输入-隐层-输出的逐步手推
1 BP算法总结 BP算法:bp算法实际上是在神经网络中寻找在合适条件下的最佳权重和bais.实际上是利用输出后的误差来估计输出层前一层的误差,再用这层误差来估计更前一层误差,如此获取所有各层误差估计 ...
- 假设你有一个多层感知机网络(MLP),输入层有10个节点、一个单隐层共50个神经元,最后是一个3个神经元的输出层。请问网络的结构是什么样子的使用数学形式进行描述?
假设你有一个多层感知机网络(MLP),输入层有10个节点.一个单隐层共50个神经元,最后是一个3个神经元的输出层.请问网络的结构是什么样子的使用数学形式进行描述? 输入矩阵X的形状是什么? 隐藏层的权 ...
- 多层感知机MLP、RBF网络、Hopfield网络、自组织映射神经网络、神经网络算法地图
多层感知机MLP.RBF网络.Hopfield网络.自组织映射神经网络.神经网络算法地图 目录
- BP网络Python实现代码
➤00 说明 本文后面给出的BP网络Python代码主要依据 <飞浆PaddlePaddle深度学习实战> 中给出的示例进行总结而得. AC20KHz.AVI 无线充电系统 裁判系统的简介 ...
最新文章
- 【PAT乙级】1067 试密码 (20 分)
- 小数向上_【实操技巧】社保计算方法:向上取整见分进角(上)
- poj2955 Brackets 最大括号匹配 区间动态规划
- fibonacci数列前20项_数学第十七课:数列综合应用第一弹
- JDK11+Maven开发JavaFx启动问题:java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper
- linux 自启动脚本顺序,(linux开机启动脚本的顺序.doc
- ActiveMQ发布订阅模式
- Redis的数据类型及其常用命令
- 2018年香港访港旅客超6500万人次 创16年新高
- centos7修改主机名hostname
- 测控专业英语复习资料
- LAMP架构一(介绍)
- 总线及单片机各种线 以及数据总线宽度
- 无线网络有信号显示未连接网络连接服务器,无线上网显示未识别网络怎么办
- excel怎么设置密码?加密文件这么做!
- 据说是最健康的作息时间表
- Kotlin Sealed 是什么?为什么 Google 都用
- 前端.什么是冒泡和阻止冒泡的原因和方法
- Word设置二级标题的编号后,第二章下的二级标题的编号仍为1.X
- ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY1.2