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)训练时学习新样本有遗忘旧样本的趋势。(可以把最优的权重记录下来)

机器学习:python使用BP神经网络示例的更多相关文章

  1. python对BP神经网络实现

    python对BP神经网络实现 一.概念理解 开始之前首先了解一下BP神经网络,BP的英文是back propagationd的意思,它是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称 ...

  2. Python实现bp神经网络识别MNIST数据集

    title: "Python实现bp神经网络识别MNIST数据集" date: 2018-06-18T14:01:49+08:00 tags: [""] cat ...

  3. python构建bp神经网络_曲线拟合(一个隐藏层)__2.代码实现

    IDE:jupyter 抽象程度可能不是那么高,以后再优化. 理论和代码实现的差距还是挺大的 数据集请查看 python构建bp神经网络(一个隐藏层)__1.数据可视化 部分代码预览 git上传.ip ...

  4. 用Python实现BP神经网络(附代码)

    用Python实现出来的机器学习算法都是什么样子呢? 前两期线性回归及逻辑回归项目已发布(见文末链接),今天来讲讲BP神经网络. BP神经网络 全部代码 https://github.com/lawl ...

  5. 08机器学习实战之BP神经网络

    1. 背景:      1.1 以人脑中的神经网络为启发,历史上出现过很多不同版本      1.2 最著名的算法是1980年的 backpropagation  2. 多层向前神经网络(Multil ...

  6. python构建bp神经网络_曲线拟合(一个隐藏层)__1.可视化数据

    1.将数据写入csv文件,应该可以python代码直接实现数据集的写入,但我对文件读取这块不太熟练,等我成功了再加上,这里我直接手写将数据集写入Excel 2.然后把后缀改成.csv就可以了,利用pa ...

  7. python构建bp神经网络_鸢尾花分类(一个隐藏层)__2.代码实现

    IDE:jupyter   数据集请查看:鸢尾花数据集 测试效果预览   成功率96.7% 代码已上传到码云

  8. python构建bp神经网络_鸢尾花分类(一个隐藏层)__1.数据集

    IDE:jupyter 目前我知道的数据集来源有两个,一个是csv数据集文件另一个是从sklearn.datasets导入 1.1 csv格式的数据集(下载地址已上传到博客园----数据集.rar) ...

  9. BP神经网络与Python实现

    人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善. 联想大家熟悉的回归问题, 神经网络模型实际上是根据训练样本创造出一个多维输入多维输出的函数, 并使用该函数进行预测, 网 ...

随机推荐

  1. 浏览器的F5和Ctrl+F5

    在浏览器里中,按F5键和按F5同时按住Ctrl键(简称Ctrl+F5),效果是不同,到底两者有什么区别呢? 假如我第一次访问过http://localhost/home,这个网页是个动态网页,每次访问 ...

  2. Window安装Redis并设置为开机启动

    一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址 ...

  3. SAP PP顾问面试题及资料

    SAP PP顾问面试试题及资料 1.主数据 组织架构 •SAP中主要的组织架构有哪些?哪些用于PP的组织架构?•成本控制范围.公司代码.估价范围.工厂.库存地点之间的关系 物料主数据 •不同的物料主数 ...

  4. 转《Angular4项目部署到服务器上刷新404解决办法》

    刚遇到Angular4项目npm run build 后部署到服务器可以访问,但是刷新页面会出现404的错误!转载一大神的操作 解决angular2页面刷新后报404错误办法: 配置app.modul ...

  5. mysql 数据表备份导出,恢复导入操作实践

    因为经常跑脚本的关系, 每次跑完数据之后,相关的测试服数据库表的数据都被跑乱了,重新跑脚本恢复回来速度也不快,所以尝试在跑脚本之前直接备份该表,然后跑完数据之后恢复的方式,应该会方便一点.所以实践一波 ...

  6. ava 8中的新功能特性

    正如我之前所写的,Java 8中的新功能特性改变了游戏规则.对Java开发者来说这是一个全新的世界,并且是时候去适应它了. 在这篇文章里,我们将会去了解传统循环的一些替代方案.在Java 8的新功能特 ...

  7. BZOJ5252 八省联考2018林克卡特树(动态规划+wqs二分)

    假设已经linkcut完了树,答案显然是树的直径.那么考虑这条直径在原树中是怎样的.容易想到其是由原树中恰好k+1条点不相交的链(包括单个点)拼接而成的.因为这样的链显然可以通过linkcut拼接起来 ...

  8. Ant Trip HDU - 3018(欧拉路的个数 + 并查集)

    题意: Ant Tony和他的朋友们想游览蚂蚁国各地. 给你蚂蚁国的N个点和M条边,现在问你至少要几笔才能所有边都画一遍.(一笔画的时候笔不离开纸) 保证这M条边都不同且不会存在同一点的自环边. 也就 ...

  9. 架构师成长之路7.1 CDN理论

    点击返回架构师成长之路 架构师成长之路7.1 CDN理论 CDN,Content Distribute Network,内容分发网络:CDN解决的是如何将数据快速可靠从源站传递到用户的问题.用户获取数 ...

  10. 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)

    [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...