1.简介(只是简单介绍下理论内容帮助理解下面的代码,如果自己写代码实现此理论不够)

1) BP神经网络是一种多层网络算法,其核心是反向传播误差,即: 使用梯度下降法(或其他算法),通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。

BP神经网络模型拓扑结构包括输入层(input)、隐藏层(hidden layer)和输出层(output layer),每层包含多个神经元。

2)BP神经网络示例图

上图就是一个简单的三层BP神经网络。网络共有6个单元,O0用于表示阈值,O1、O2为输入层,O3、O4为第一隐层,也是唯一隐层,O5为输出层单元。网络接收两个输入 ,发送一个输出 。每个单元接收一组输入,发送一个输出。 为权值,例如W40 表示O0与O4之间的权重。

3)神经单元(计算单元)

如上图所示,每个圆表示一个神经单元。其接收一组数据,经过计算输出一个数据。

4)传播过程

a)正向传递

例如:从O1-->O4-->05,这是正向传递过程中的一个路径(O4除了接收O1,还接收O0、O2的输入)。这里重点说下权重,W41表示O1和O4之间的权重,假如O1=1,O4=4,W41=0.5,那么O5=1*4*0.5=2(2不是最终输出,最终输出还需要加上O0、O2 的计算结果).

b)反向传递(过程比较复杂,这个表述不是特别精确,只是为了方便理解)

例如:从O1<--O4<--05,在这个过程中,O5是计算出的值,参与计算的O4的值不是其本身的值,而是在正向传递过程中计算出的值(即输出值)。而权重也是这个过程中调整的。

2.MLPClassifier函数

此函数是sklearn.neural_network中的函数,它是利用反向传播误差进行计算的多层感知器算法。

a) 主要参数

hidden_​​layer_sizes:隐藏层,例如:(5,2) 表示有2个隐藏层,第一隐藏层有5个神经单元,第二个隐藏层有2个神经单元;(5,2,4)表示有三个隐藏层。

activation:激活函数,在反向传递中需要用到。有以下四个可选项:

'identity':无激活操作,有助于实现线性瓶颈, 返回 f(x) = x

'logistic':逻辑函数, 返回 f(x) = 1 / (1 + exp(-x)).

'tanh': 双曲线函数, 返回 f(x) = tanh(x).

'relu': 矫正线性函数, 返回 f(x) = max(0, x),(默认)

solver:反向传播过程中采用的算法,有以下三个选项:

'lbfgs': 准牛顿算法.适用于较小数据集

'sgd': 随机梯度下降算法.

'adam':优化的随机梯度下降算法(默认)。适用于较大数据集

alpha:L2惩罚系数

learning_rate:学习速率,有以下几个选项:(只有当slver='sgd'时有用)

constant:参数learning_rate_init指定的恒定学习速率.(默认选项)

invscaling’:使用“scale_t”的反向缩放指数逐渐降低每个时间步长t 的学习率。effective_learning_rate = learning_rate_init / pow(t,power_t)(power_t是另外一个参数)

adaptive: 自适应,只要损失不断下降就是用learning_rate_init。否则会自动调整(由另外一个参数tol决定)。

learning_rate_init:初始学习速率

b)属性

coefs_:权重列表

n_layers_:神经网络的总层数

3.示例一

本示例使用的数据:机器学习:从编程的角度去理解逻辑回归 。在下面的参数情况下正确率95%。

import numpy as np
import os
import pandas as pd
from sklearn.neural_network import MLPClassifier def loadDataSet():
##运行脚本所在目录
base_dir=os.getcwd()
##记得添加header=None,否则会把第一行当作头
data=pd.read_table(base_dir+r"\lr.txt",header=None)
##dataLen行dataWid列 :返回值是dataLen=100 dataWid=3
dataLen,dataWid = data.shape
##训练数据集
xList = []
##标签数据集
lables = []
##读取数据
for i in range(dataLen):
row = data.values[i]
xList.append(row[0:dataWid-1])
lables.append(row[-1])
return xList,lables def GetResult():
dataMat,labelMat=loadDataSet()
clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
hidden_layer_sizes=(5,2), random_state=1)
clf.fit(dataMat, labelMat)
#print("层数----------------------")
#print(clf.n_layers_)
#print("权重----------------------")
#for cf in clf.coefs_:
# print(cf)
#print("预测值----------------------")
y_pred=clf.predict(dataMat)
m = len(y_pred)
##分错4个
t = 0
f = 0
for i in range(m):
if y_pred[i] ==labelMat[i]:
t += 1
else :
f += 1
print("正确:"+str(t))
print("错误:"+str(f)) if __name__=='__main__':
GetResult()

4.示例二(数据来源)

这次使用的数据还是红酒。因为红酒的口感得分是整数,所以也可以当作是分类。但是针对此实验数据,在多次调整参数的过程中(主要是调整隐藏层)正确率最高只有61%。这正是BP神经网络的一个缺陷:隐含层的选取缺乏理论的指导。

代码:

import numpy as np
import os
import pandas as pd
from sklearn.neural_network import MLPClassifier ##运行脚本所在目录
base_dir=os.getcwd()
##记得添加header=None,否则会把第一行当作头
data=pd.read_table(base_dir+r"\wine.txt",header=None,sep=';')
##dataLen行dataWid列 :返回值是dataLen=1599 dataWid=12
dataLen,dataWid = data.shape ##训练数据集
xList = []
##标签数据集
lables = []
##读取数据
for i in range(dataLen):
row = data.values[i]
xList.append(row[0:dataWid-1])
lables.append(row[-1])
##设置训练函数
clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
hidden_layer_sizes=(14,14,30), random_state=1)
##开始训练数据
clf.fit(xList, lables)
##读取预测值
y_pred=clf.predict(xList)
m = len(y_pred) t = 0
f = 0
##预测结果分析
for i in range(m):
if int(y_pred[i]) == lables[i]:
t += 1
else :
f += 1
print("正确:"+str(t))
print("错误:"+str(f))

5.BP神经网络的缺点 

1)容易形成局部极小值而得不到全局最优值。BP神经网络中极小值比较多,所以很容易陷入局部极小值,这就要求对初始权值和阀值有要求,要使得初始权值和阀值随机性足够好,可以多次随机来实现。
      2)训练次数多使得学习效率低,收敛速度慢。
      3)隐含层的选取缺乏理论的指导。
      4)训练时学习新样本有遗忘旧样本的趋势。(可以把最优的权重记录下来)

机器学习:从编程的角度理解BP神经网络的更多相关文章

  1. 从编程的角度理解gradle脚本﹘﹘Android Studio脚本构建和编程[魅族Degao]

    本篇文章由嵌入式企鹅圈原创团队.魅族资深project师degao撰写. 随着Android 开发环境从Eclipse转向Android Studio,我们每一个人都開始或多或少要接触gradle脚本 ...

  2. 机器学习(4):BP神经网络原理及其python实现

    BP神经网络是深度学习的重要基础,它是深度学习的重要前行算法之一,因此理解BP神经网络原理以及实现技巧非常有必要.接下来,我们对原理和实现展开讨论. 1.原理  有空再慢慢补上,请先参考老外一篇不错的 ...

  3. 菜鸟之路——机器学习之BP神经网络个人理解及Python实现

    关键词: 输入层(Input layer).隐藏层(Hidden layer).输出层(Output layer) 理论上如果有足够多的隐藏层和足够大的训练集,神经网络可以模拟出任何方程.隐藏层多的时 ...

  4. 机器学习:python使用BP神经网络示例

    1.简介(只是简单介绍下理论内容帮助理解下面的代码,如果自己写代码实现此理论不够) 1) BP神经网络是一种多层网络算法,其核心是反向传播误差,即: 使用梯度下降法(或其他算法),通过反向传播来不断调 ...

  5. NO.2:自学tensorflow之路------BP神经网络编程

    引言 在上一篇博客中,介绍了各种Python的第三方库的安装,本周将要使用Tensorflow完成第一个神经网络,BP神经网络的编写.由于之前已经介绍过了BP神经网络的内部结构,本文将直接介绍Tens ...

  6. 机器学习(一):梯度下降、神经网络、BP神经网络

    这几天围绕论文A Neural Probability Language Model 看了一些周边资料,如神经网络.梯度下降算法,然后顺便又延伸温习了一下线性代数.概率论以及求导.总的来说,学到不少知 ...

  7. 【机器学习】BP神经网络实现手写数字识别

    最近用python写了一个实现手写数字识别的BP神经网络,BP的推导到处都是,但是一动手才知道,会理论推导跟实现它是两回事.关于BP神经网络的实现网上有一些代码,可惜或多或少都有各种问题,在下手写了一 ...

  8. 机器学习入门学习笔记:(一)BP神经网络原理推导及程序实现

    机器学习中,神经网络算法可以说是当下使用的最广泛的算法.神经网络的结构模仿自生物神经网络,生物神经网络中的每个神经元与其他神经元相连,当它“兴奋”时,想下一级相连的神经元发送化学物质,改变这些神经元的 ...

  9. 简单易学的机器学习算法——神经网络之BP神经网络

    一.BP神经网络的概念     BP神经网络是一种多层的前馈神经网络,其基本的特点是:信号是前向传播的,而误差是反向传播的.详细来说.对于例如以下的仅仅含一个隐层的神经网络模型: watermark/ ...

随机推荐

  1. Java核心编程快速学习

    Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示. 反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的 ...

  2. MySQL学习笔记(三)—索引

    一.概述 1.基本概念       在大型数据库中,一张表中要容纳几万.几十万,甚至几百万的的数据,而当这些表与其他表连接后,所得到的新的数据数目更是要大大超出原来的表.当用户检索这么大量的数据时,经 ...

  3. nlog学习使用

    最近有不少朋友推荐我用NLog.我以前都是自己写txt的文本输出log,以前别人用log4net的时候看那个配置文件,看得我一阵烦,我比较喜欢约定胜于配置的组件.这次玩了一波NLog,,相当不错.一下 ...

  4. Webdriver API之元素定位

    Webdriver提供了8种元素定位方法:id.name.class name.tag name.link text.partial link text.xpath.css selector 一.以上 ...

  5. Java NIO之通道

    一.前言 前面学习了缓冲区的相关知识点,接下来学习通道. 二.通道 2.1 层次结构图 对于通道的类层次结构如下图所示. 其中,Channel是所有类的父类,其定义了通道的基本操作.从 Channel ...

  6. angular的$http.post()提交数据到Java后台接收不到参数值问题的解决方法

    本文地址:http://www.cnblogs.com/jying/p/6733408.html   转载请注明出处: 写此文的背景:在工作学习使用angular的$http.post()提交数据时, ...

  7. NodeJs系列一:神奇的nodejs

    nodejs是什么 nodejs能解决什么问题 非阻塞型I/O及事件环机制 什么时候使用nodejs nodejs是什么 Node.js是让Javascript脱离浏览器运行在服务器的一个平台(或者叫 ...

  8. 【Tomcat源码学习】-2.容器管理

    Tomcat作为应用服务器,我们可以理解Tomcat本身就是一个容器,用于装载应用,而作为容器本身是由若干组件以及事件构成,容器管理即为管理容器的有机组成部分.   一.Tomcat整体结构: Ser ...

  9. EF 关联数据查询

    1 直接使用表对应的实例属性值 ,如本例中的RoleUserInfo的属性UserInfo IEnumerable <RoleUserInfo > roleUserInfos= db.Ro ...

  10. 一个 Vue + Node + MongoDB 博客系统

    源码 耗时半载(半个月)的大项目终于完成了.这是一个博客系统,使用 Vue 做前端框架,Node + express 做后端,数据库使用的是 MongoDB.实现了用户注册.用户登录.博客管理(文章的 ...