【李航统计学】Chap2:感知机及代码实现
Chap2:感知机
- 1. 感知机模型
- 2. 感知机学习策略
- 2.1 损失函数
- 2.2 范数
- 3. 感知机学习算法
- 3.1 原始形式
- 3.1.1 算法实现
- 3.1.2 举个栗子
- 3.1.3 算法的收敛性
- 3.2 对偶形式
- 3.2.1算法实现
- 3.2.2 对偶形式的理解
- 3.2.3 举个栗子
- 4. 总结
- 5. 代码实现
- 5.1 数据准备
- 5.2 感知机实现
- 5.3 scikit-learn实例
1. 感知机模型
- 感知机 是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。
- 感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classification medel)或线性分类器(linear classifier),即函数集合{f∣f(x)=w⋅x+b}\{f|f(x) = w·x+b\}{f∣f(x)=w⋅x+b}
- 分离超平面(separating hyperplane):线性方程 w⋅x+b=0w·x+b=0w⋅x+b=0对应于特征空间RnR^nRn中的一个超平面,其中www是超平面的法向量,bbb是超平面的截距,这个特征空间因此被划分为两个部分,两部分的点分别分为正负两类,则超平面S则被称为分离超平面。
2. 感知机学习策略
- 线性可分数据集(linearly separable dataset): 即存在某个超平面能够将数据集二点正实例点和复实例点完全正确的划分到超平面的两侧,即对所有yi=+1y_i=+1yi=+1的实例iii,有w⋅xi+b>0w·x_i+b>0w⋅xi+b>0,对于所有yi=−1y_i=-1yi=−1的实例iii,有w⋅xi+b<0w·x_i+b<0w⋅xi+b<0。
==> 确定学习策略,即定义(经验)损失函数并将损失函数极小化
2.1 损失函数
损失函数的一个自然选择是误分类点的综述,但这样的损失函数不是参数w,bw,bw,b的连续可导函数不易优化。故感知机选择误分类点到超平面S的总距离,作为其损失函数。
输入空间RnR^nRn中任一点x0x_0x0到超平面SSS的距离(∣∣w∣∣||w||∣∣w∣∣是www的L2L_2L2范数,2.2中补充):
1∣∣w∣∣∣w⋅x0+b∣\frac{1}{||w||}|w·x_0+b|∣∣w∣∣1∣w⋅x0+b∣
当w⋅xi+b>0w·x_i+b>0w⋅xi+b>0时,yi=+1y_i=+1yi=+1;w⋅xi+b<0w·x_i+b<0w⋅xi+b<0时,yi=−1y_i=-1yi=−1的实例iii,所以呢~距离应该表示为:−1∣∣w∣∣yi∣w⋅x0+b∣-\frac{1}{||w||}y_i|w·x_0+b|−∣∣w∣∣1yi∣w⋅x0+b∣
假设所有误分类点集合为MMM,那么误分类点到超平面SSS的总距离为:
−1∣∣w∣∣∑xi∈Myi(w⋅xi+b)-\frac{1}{||w||}\sum\limits_{x_i\in M}y_i(w·x_i+b)−∣∣w∣∣1xi∈M∑yi(w⋅xi+b)
不考虑1∣∣w∣∣\frac{1}{||w||}∣∣w∣∣1,即为感知机sign(w⋅x+b)sign(w·x+b)sign(w⋅x+b)的损失函数:L(w,b)=−∑xi∈Myi(w⋅xi+b)L(w,b)=-\sum\limits_{x_i\in M}y_i(w·x_i+b)L(w,b)=−xi∈M∑yi(w⋅xi+b)
寻找上式中最小的模型参数w,bw,bw,b,即感知机模型
2.2 范数
范数是具有“长度”概念的函数。在向量空间内,为所有的向量的赋予非零的增长度或者大小。不同的范数,所求的向量的长度或者大小是不同的。
严谨一点的概念如下图(矩阵论P109P_{109}P109)
L1范数
是指向量中各个元素绝对值之和L2范数
是指向量各元素的平方和然后求平方根- 特别的
L0范数
:指向量中非零元素的个数无穷范数
:指向量中所有元素的最大绝对值。
其在监督学习中的应用区别可具体参考这篇文章,在此就不展开了。
3. 感知机学习算法
利用随机梯度下降法(stochastic gradient descent)求解损失函数极小化问题
3.1 原始形式
3.1.1 算法实现
- 首先任意选取一个超平面w0,b0w_0,b_0w0,b0,SGD不断极小化下式目标函数。极小化过程是每次随机选取一个误分类点使其梯度下降,而不是一次性完成M中所有点。
L(w,b)=−∑xi∈Myi(w⋅xi+b)L(w,b)=-\sum\limits_{x_i\in M}y_i(w·x_i+b)L(w,b)=−xi∈M∑yi(w⋅xi+b)
损失函数L(w,b)L(w,b)L(w,b)的梯度:
随机选取一个误分类点(xi,yi)(x_i,y_i)(xi,yi)对w,bw,bw,b进行更新(η(0<η⩽1)\eta(0<\eta\leqslant1)η(0<η⩽1)为学习率):
总结
直观理解这个过程:
当一个实例点被错误分类时,即位于超平面的错误一侧,通过调整w,bw,bw,b的值使得超平面向误分类点的一侧移动,以减少该误分类点和超平面之间的距离,直至该超平面超过该误分类点使其被正确分类。
3.1.2 举个栗子
- 然鹅,误分类点的选取顺序是我们人为选择的,不同的选择方式可能得到不同的部分超平面。可见,感知机学习算法由于采用不同的初值或选取不同的误分类点,解可以不同。
3.1.3 算法的收敛性
结论:
对于线性可分数据集感知机学习算法原始形式是收敛的,即经过有限次迭代可以得到一个将训练数据集完全正确划分的分离超平面以及感知机模型。
证明:
pass(李航统计学习方法 第二版 P41P_{41}P41)
3.2 对偶形式
3.2.1算法实现
对偶形式的基本思路:将w,bw,bw,b表示为实例xix_ixi和它的标记yiy_iyi的线性组合的形式,通过求解其系数而求得w,bw,bw,b
随机选取一个误分类点(xi,yi)(x_i,y_i)(xi,yi)对w,bw,bw,b进行更新(η(0<η⩽1)\eta(0<\eta\leqslant1)η(0<η⩽1)为学习率):
逐步修改w,bw,bw,b,容易得到最终学习到的w,bw,bw,b可以分别表示为:
αi=niη\alpha_i=n_i\etaαi=niη,nin_ini表示修改次数,αi≥0,i=1,2,…,N\alpha_i \geq0,i =1,2,…,Nαi≥0,i=1,2,…,N,当η=1\eta=1η=1时,表示第i个实例点由于误分类而进行更新的次数。更新次数越多意味着他距离分类超平面越接近,也就越难分类,换言之,这样的实例对学习结果影响最大。
总结
参数更新时对www没有做累加是因为采用的随机梯度下降的方式。
3.2.2 对偶形式的理解
结论写在前面:
对偶形式是为了降低运算量,且在特征空间维度很高时才起到作用。
对偶形式的感知机,把每轮迭代的时间复杂度的数据规模从特征空间维度 nnn 转移到了训练集大小 NNN上,对于维度非常高的空间能提升性能。具体分析一下:
特征空间为Rn,nR^n,nRn,n很大,共有NNN个训练数据,且N<<nN<<nN<<n原始形式:每一轮迭代中对输入实例进行误判点判断,即对于xi,yix_i,y_ixi,yi,是否有yi(wxi+b)≤0y_i(wx_i+b)\leq0yi(wxi+b)≤0. 时间复杂度O(n)O(n)O(n)主要集中在求输入实例xix_ixi和权值www的内积,由于特征空间维度很高,所以计算很慢
对偶形式:对于输入实例xi,yix_i,y_ixi,yi的判断变为yi(∑j=1Nαjyjxjxi+b)≤0y_{i}\left(\sum_{j=1}^{N} \alpha_{j} y_{j} x_{j} x_{i}+b\right) \leq 0yi(∑j=1Nαjyjxjxi+b)≤0。在这里我们可以预先计算出输入实例两两之间的内积,得到Gram矩阵,即G=[xjxi]N∗NG=[x_jx_i]_{N*N}G=[xjxi]N∗N.在做误差点判断时直接在Gram矩阵中查表得到xjxix_jx_ixjxi,时间复杂度变为O(N)O(N)O(N)。
总结一下下
- 简单来说就是原始形式中,感知机所有参数一共需要更新n次,每次参数改变,所有的矩阵都要重新计算。
- 对偶形式就是将这n次分摊到i个样本中去,最终的参数可以展开使用每个样本点进行表示,即在判断误分类时都可以展开成样本之间的点乘形式,这样就可以利用提前计算好的Gram矩阵来大大降低运算量
3.2.3 举个栗子
好乱凑合看
4. 总结
感知机是根据输入实例的特征向量xxx对其进行二类分类的线性分类模型:f(x)=sign(w⋅x+b)f(x)=sign(w·x+b)f(x)=sign(w⋅x+b)
感知机模型对应于输入空间(特征空间)中的分离超平面w⋅x+b=0w·x+b=0w⋅x+b=0感知机模型的学习策略为极小化损失函数,损失函数定义为误分类点到分离超平面的总距离:
minw,bL(w,b)=−∑xi∈Myi(w⋅xi+b)\min _{w, b} L(w, b)=-\sum_{x_{i} \in M} y_{i}\left(w \cdot x_{i}+b\right)w,bminL(w,b)=−xi∈M∑yi(w⋅xi+b)感知机学习算法基于随机梯度下降对损失函数进行优化,分为原始形式和对偶形式,算法简单易实现。
当训练集数据线性可分时,感知机学习算法是收敛的。
当训练数据集线性可分时,感知机学习算法存在无穷多个解,其解由于其参数不同的初值和不同的迭代顺序而有所不同。
5. 代码实现
5.1 数据准备
利用iris数据集中两个分类的数据和[sepal length,sepal width]作为特征
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as pltiris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)df['label'] = iris.target
print(df)
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
print(df)
print(df.label.value_counts())plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], labels='0') #数据集每50行分别对应一个标签:0,1,2
plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')
plt.scatter(df[100:]['sepal length'], df[50:100]['sepal width'], label='2')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend() # 给图片加上图例
plt.show()
import numpy as np
data = np.array(df.iloc[:100, [0, 1, -1]]) # data取前100行数据即0,1两个标签,选取两个属性列和最后一列label列
X = data[:, :-1]
y = data[:, -1]
y = np.array([1 if i == 1 else -1 for i in y]) #把标签0,1转换为-1,1,进行分类时使用
5.2 感知机实现
class Model:def __init__(self):self.w = np.ones(len(data[0])-1, dtype=np.float32) #w初始化为1,个数为输入特征维度-1 (label那一维)self.b = 0self.eta = 0.1 # 学习率def sign(self, x, w, b):y = np.dot(x, w) + breturn y# 随机梯度下降算法def fit(self, X_train, y_train):classify_wrong = Truewhile classify_wrong: #有误分类点wrong_count = 0for d in range(len(X_train)):X = X_train[d]y = y_train[d]if y * self.sign(X, self.w, self.b) <= 0: # 当误分类时self.w = self.w + self.eta * np.dot(y, X)self.b = self.b + self.eta * ywrong_count += 1if wrong_count == 0:classify_wrong = False # 当没有误分类点时,return "原始形式的感知机模型写好啦!~~"perceptron = Model()
print(perceptron.fit(data_x, data_y))# 可视化一下
x_points = np.linspace(4, 7, 10)
y_points = - (perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1]
plt.plot(x_points, y_points)
plt.show()
- y_points = - (perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1] 超平面绘制
其中w的两维分别对应两个特征,在散点图中分别对应x轴和y轴,所以呢这条线应该:
perceptron.w[0] * x_points + perceptron.w[1] * y_points + perceptron.b = 0
y_points 即等于上式~
5.3 scikit-learn实例
import sklearn
from sklearn.linear_model import Perceptronclf = Perceptron(fit_intercept=True, max_iter=1000, shuffle=True)
"""fit_intercept : bool, default=TrueWhether the intercept should be estimated or not. If False, thedata is assumed to be already centered.max_iter : int, default=1000The maximum number of passes over the training data (aka epochs).It only impacts the behavior in the ``fit`` method, and not the:meth:`partial_fit` method.
"""
clf.fit(data_x,data_y)# 特征的权重
print(clf.coef_) # [[ 23.2 -38.7]]
# 截距
print(clf.intercept_) # [-5.]# 可视化一下
plt.figure(figsize=(10, 10))
plt.title("鸢尾花线性数据示例")plt.scatter(data[:50, 0], data[:50, 1], c='b', label='Iris-setosa')
plt.scatter(data[50:100, 0], data[50:100, 1], c='orange', label='Iris-versicolor')# 绘制感知机的线
x_points = np.arange(4, 8)
y_points = -(clf.coef_[0][0]*x_points + clf.intercept_)/clf.coef_[0][1]
plt.plot(x_points, y_points)
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
plt.show()
此时可以看到结果图中有两个问题
- 图片figure title中文没有正常显示
- 有一个蓝色点分类错误
- 因为 SKlearn 的 Perceptron 实例中有一个tol参数,tol 参数规定了如果本次迭代的损失和上次迭代的损失之差小于一个特定值时,停止迭代,所以我们需要设置 tol=None 使之可以继续迭代:)
对这两个问题依次进行解决:
#Q1
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title("鸢尾花线性数据示例")
#Q2
clf = Perceptron(fit_intercept=True, max_iter=1000, tol=None, shuffle=True)
最终得到的结果如下图所示~
啊
终于
写完了
真好!
【李航统计学】Chap2:感知机及代码实现相关推荐
- python实现代码_python感知机实现代码
本文实例为大家分享了python感知机实现的具体代码,供大家参考,具体内容如下 一.实现例子 李航<统计学方法>p29 例2.1 正例:x1=(3,3), x2=(4,3), 负例:x3= ...
- 李航统计学习感知机算法实现
前言 李航的<统计学习方法>和西瓜书是入门机器学习进而到深度学习的经典书籍,笔者是数学专业大二在读,在编程方面仍有许多不足之处,在已经看完相关经典书籍后开始编程实践.因为本人愚钝,且不善编 ...
- 李航统计方法——感知机
李航统计学习方法--感知机 文章目录 李航统计学习方法--感知机 1.数据集的线性可分性 2.感知机学习策略 3.感知机学习算法 3.1感知机学习算法原始形式 3.2感知机学习算法的对偶形式 1.数据 ...
- 李航统计学习方法----感知机章节学习笔记以及python代码
目录 1 感知机模型 2 感知机学习策略 2.1 数据集的线性可分性 2.2 感知机学习策略 3 感知机学习算法 3.1 感知机学习算法的原始形式 3.2 感知机算法的对偶形式 4 感知机算法pyth ...
- python底层源码_大师兄的Python机器学习笔记:统计学基础之底层代码实现(一)...
一.中心趋势度量(Measure of Central Tendency) 1.众数(mode) 符号: 一组数据中出现最多的值. 纯python代码实现: >>>def calcu ...
- 【李航统计学习方法】感知机模型
目录 一.感知机模型 二.感知机的学习策略 三.感知机学习算法 感知机算法的原始形式 感知机模型的对偶形式 参考文献 本章节根据统计学习方法,分为模型.策略.算法三个方面来介绍感知机模型. 首先介绍感 ...
- 机器学习入门(01)— 感知机概念、实现、局限性以及多层感知机
1. 感知机概念 下图是一个接收两个输入信号的感知机的例子. x1 . x2 是输入信号, y 是输出信号, w1 . w2 是权重( w 是 weight 的首字母).图中的 ○ 称为"神 ...
- DL之Perceptron:Perceptron感知器(感知机/多层感知机/人工神经元)的简介、原理、案例应用(相关配图)之详细攻略
DL之Perceptron:Perceptron感知器(感知机/多层感知机/人工神经元)的简介.原理.案例应用(相关配图)之详细攻略 目录 Perceptron的简介.原理 多层感知机 实现代码 案例 ...
- 手机上的机器学习资源!Github标星过万的吴恩达机器学习、深度学习课程笔记,《统计学习方法》代码实现!...
吴恩达机器学习.深度学习,李航老师<统计学习方法>.CS229数学基础等,可以说是机器学习入门的宝典.本文推荐一个网站"机器学习初学者",把以上资源的笔记.代码实现做成 ...
最新文章
- SAP PM单一和复合角色
- leetcode 668. Kth Smallest Number in Multiplication Table | 668. 乘法表中第k小的数(二分查找)
- win10 vscode 无法激活python 虚拟环境的解决办法
- 为什么感觉每年手机都在升级CPU,但始终都会卡顿?
- Mathematica颜色系,你喜欢哪一个?
- ZPCategory
- matlab信号探测,信号检测与估matlab仿真报告.doc
- 纬地道路纵断面设计教程_市政道路从识图算量到施工,一篇全搞定
- 咕咕数据港股实时行情数据
- 本科生如何学习计算机科学与技术
- seaborn 频数统计直方图
- Google收购Moto:天使还是魔鬼?
- CentOS 7 搭建 TinyProxy 代理
- 华师计算机基础在线作业秋,17秋华师《计算机基础》在线作业 (答案)
- emu8086汇编语言操作文件指令详解
- Android Studio提高效率常用插件整理
- 苹果屏幕尺寸_2020年,没有小屏幕手机!
- 这个对PID的讲解也是不错的,和我当初在B站上看到的一个英文视频类似
- ZBrush是做什么的?跟次世代3D建模什么关系
- Julia学习笔记:堆积柱形图的绘制