第二章监督学习_神经网络
01 多层感知机 原理
先来看俩个图片:
import mglearn
# 快速演示返回的内容是dot文件
# 以后看到graphviz包直接联想dot就可以了
# 线性模型
gh1 = mglearn.plots.plot_logistic_regression_graph()
# 神经网络,多层感知机
gh2 = mglearn.plots.plot_single_hidden_layer_graph()
pdf1_file = r"D:\999_Temp\999_Tmp\line.dot"
pdf2_file = r"D:\999_Temp\999_Tmp\neural.dot"
# 需要将dot文件转换一下可以读的格式,默认是转成pdf
gh1.render(pdf1_file)
gh2.render(pdf2_file)
原理:
- 多层感知机是从线性模型演化来的
- 多层感知机是在线性模型的基础上增加虚拟层(可以是多层)来提高线性模型能力
- 虚拟层上的每个单元称作隐单元
- 计算步骤1: (各个特征 * 各个特征加权) 到各个隐单元的值
- 计算步骤2: (各个隐单元 * 虚拟层权重) 虚拟层各个隐单元的值
比较线性模型与多层感知机模型的公式:
- 线性模型
y= w[0]*x[0] + w[1]*x[1] + … + w[n]*x[n] + b
x: 特征
w: 特征权重
b: 偏移量 - 多层感知机模型 (1个虚拟层, 3个隐单元为例)
h[0] = tanh(w[0,0]*x[0] + w[1,0]*x[1] + w[2,0]*x[2] + w[3,0]*x[3] + b[0])
h[1] = tanh(w[0,0]*x[0] + w[1,0]*x[1] + w[2,0]*x[2] + w[3,0]*x[3] + b[1])
h[2] = tanh(w[0,0]*x[0] + w[1,0]*x[1] + w[2,0]*x[2] + w[3,0]*x[3] + b[2])
y = v[0]*h[0] + v[1]*h[1] + v[2]*h[2] + b
x:特征
w:特征至虚拟层的权重 (由数据计算得出)
b:偏移量
h:虚拟层
h[index]:虚拟层中的隐单元
tanh:正切双曲线 (为了校正虚拟层的计算结果)
v:虚拟层至结果的权重 (由数据计算得出)
02 神经网络介绍
书中提到了两个神经网络模型,但是讲解说明时只用了一个举例说明.
- from sklearn.neural_network import MLPClassifier
- from sklearn.neural_network import MLPRegressor
看起来一个是处理分类一个是处理回归问题的.
书中只是简单介绍了一下这俩个模型,可能是因为sklearn并不是神经网络的专用库.
关于比较好的深度学库书中提到了3个: 有精力的可以去研究研究 - keras
- lasagna
- tensor-flow
03 神经网络模型 的重要参数
因为书中只有关于MLPClassifier的例子,所以就以这个为例简单介绍.
神经网络模型区别于线性模型的关键点是增加了虚拟层和隐单元,因此最重要的参数首先要介绍这两个.
接下了进入了枯燥公式环节:
前提: 数据样本中有100个特征, 1个虚拟层, 100个隐单元
(线性模型)权重个数: 100(特征) * 1(输出) = 100(权重)
(神经网络模型)权重个数:
(1)各特征到虚拟层个单元: 100(特征) * 100(第一层隐单元) = 10000(权重)
(2)隐单元到输出: 100(第一层隐单元) * 1(输出) = 100(权重)
总结权重: (1) + (2) = 10100(权重)
以此类推,2层虚拟单元 100个隐单元的场合:
(1)各特征到虚拟层个单元: 100(特征) * 100(第一层隐单元) = 10000(权重)
(2)第一虚拟层各隐单元至第二虚拟层各隐单元: 100(第一层隐单元)* 100(第二层隐单元) = 10000(权重)
(3)第二虚拟层各隐单元到输出: 100(第一层隐单元) * 1(输出) = 100(权重)
总结权重: (1) + (2) + (3) = 20100(权重)
由此可见神经网络的计算量非常大.sklearn由于只含有简单的神经网络入门模型,
因此没有GPU计算这样的高级功能,因此使用sklearn处理神经网络模型效率不高.
结合上面的介绍,接下来讲解神经网络最重要的三个参数
虚拟曾,隐单元,alpha(正则化参数)
# 神经网络模型: 重要参数说明
# 概要:
# 数据源采用2分类数据源, 100各数据样本
# 创建两个画布
# 第一画布: 一个隐层 观察 10/100隐单元 [0.0001, 0.01, 0.1, 1]alpha 对于模型的影响
# 第二画布: 二个隐层 观察 10/100隐单元 [0.0001, 0.01, 0.1, 1]alpha 对于模型的影响
import mglearn
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPClassifier
# 2分类数据集
from sklearn.datasets import make_moons
# 数据分离
from sklearn.model_selection import train_test_split
# 一个虚拟层
fig, axes = plt.subplots(2, 4, figsize=(20, 8))
for<