快速报名
首页 / 干货教程 / Python教程 / python机器学习教程02 感知机

python机器学习教程02 感知机

感知机在1957年被提出,算是最古老的分类方法之一。

  虽然感知机泛化能力不及其他的分类模型,但是如果能够对感知机的原理有一定的认识,在之后学习支持向量机、神经网络等机器学习算法的时候会轻松很多。下面和老男孩IT教育一起来学习一下吧!

感知机学习目标

感知机模型

感知机的损失函数和目标函数

感知机原始形式和对偶形式

感知机流程

感知机优缺点

感知机引入

线性可分和线性不可分

  每逢下午有体育课,总会有男孩和女孩在学校的操场上玩耍。

  假设由于传统思想的影响,男孩总会和男孩一起打打篮球,女孩总会和女孩一起踢毽子、跳跳绳,如下图所示。

# 感知机引入图例

import numpy as np

import matplotlib.pyplot as plt

from matplotlib.font_manager import FontProperties

%matplotlib inline

font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

np.random.seed(1)

x1 = np.random.random(20)+1.5

y1 = np.random.random(20)+0.5

x2 = np.random.random(20)+3

y2 = np.random.random(20)+0.5

# 一行二列第一个

plt.subplot(121)

plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)')

plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)')

plt.vlines(2.8, 0, 2, colors="r", linestyles="-", label='$wx+b=0$')

plt.title('线性可分', fontproperties=font, fontsize=20)

plt.xlabel('x')

plt.legend(prop=font)

# 一行二列第二个

plt.subplot(122)

plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)')

plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)')

plt.scatter(3.5, 1, s=50, color='b')

plt.title('线性不可分', fontproperties=font, fontsize=20)

plt.xlabel('x')

plt.legend(prop=font, loc='upper right')

plt.show()

  从左图中也可以看出总能找到一条直线将男孩和女孩分开,即男孩和女孩在操场上的分布是线性可分的,此时该分隔直线为

ωx+b=0

其中ω,b是参数,x是男孩和女孩共有的某种特征。

  如果某个男孩不听话跑到女孩那边去了,如下图右图所示,则无法通过一条直线能够把所有的男孩和女孩分开,则称男孩和女孩在操场上的分布是线性不可分的,即无法使用感知机算法完成该分类过程。

  上述整个过程其实就是感知机实现的一个过程。

感知机详解

感知机模型

  感知机是一个二分类线性模型,即输出为实例的类别,一般为其中一类称为正类(+1),另一类称为负类(−1)。可以把上图所示的男孩(+1)称为正类,女孩(−1)称为负类。

  假设有m个实例n维特征并且数据线性可分的数据集

T={(x1,y1),(x2,y2),⋯,(xm,ym)}

它的输出空间即y的取值是y={+1,−1}。

  由于数据线性可分,如果是二维空间,则总能找到一条直线将二维空间中的数据集分为两类,如上图所示的ωx+b=0,如果是三维空间,则能找到一个平面把三维空间中的数据集分为两类。对于上述的假设的数据集T,则总能找到一个超平面S将该数据集分成两类,该超平面S可以记作

ω1x1+ω2x2+⋯+ωnxn+b=0

其中如果假设ω0=b,x0=1,则超平面为

ω0x0+ω1x1+ω2x2+⋯+ωnxn=0

如果把上述公式使用向量来表示,则超平面为

ωTx=0

其中ω,x都为n+1维的向量。

  如果把ωTx>0内的数据集看成一类;把ωTx<0内的数据集看成另一类,即通过ωTx=0成功将数据集分为两类。为了将两个类别符号化,我们可以使用sign函数,由此即可得到感知机的模型为

sign(ωTx)={1,ωTx>0−1,ωTx<0

感知机损失函数

  假设有一个线性可分的数据集

T={(x1,y1),(x2,y2),⋯,(xi,yi),⋯,(xm,ym)}

则数据集中的样本xi到超平面S的距离为

|ωTxi|||ω||

其中||ω||为L2范数。

  该距离公式源自于数学中点(x0,y0)到面Ax+By+C=0的公式

Ax0+By0+CA2+B2−−−−−−−√

  假设存在一个误分类的样本(xi,yi),对有误分类的样本都存在−yi(ωTxi)>0。因为误分类时当ωTxi=1时yi=−1;当ωTxi=−1时yi=1。因此|ωTxi|=−yi(ωTxi),则误分类点到超平面S的距离即损失函数为

−yi(ωTxi)||ω||

感知机目标函数

  假设误分类点的集合为M,那么所有误分类点到超平面S的距离即感知机的目标函数为

J(ω)=∑xi∈M−yi(ωTxi)||ω||

  给定了所有误分类点到超平面的距离,我们的目的就是优化上述公式,即最小化目标函数。

  由于ωTxi=ω1x1+ω2x2+⋯+ωnxn+b,如果ω和b成比例的增加,即分子的ω和b扩大n倍时,分母的L2范数也将扩大n倍,也就是说分子和分母有固定的倍数关系,即可以将分子或分母固定为1,然后求分子自己或分母的倒数的最小化作为新的目标函数。(此处讲解拿出b,事实上b对结果的影响很小,后续会继续用向量的方式,并且忽略b)。

  感知机将分母||ω||固定为1,然后将分子的最小化作为目标函数,因此感知机的目标函数更新为

J(ω)=−∑xi∈Myi(ωTxi)

  多说一嘴,支持向量机则是将分子固定位1,然后将分母的倒数最小化作为目标函数。

  对于给定的目标函数J(ω),如果没有误分类点,目标函数值为0;如果误分类点越少,则目标函数值越小;如果误分类点越多,则目标函数值越大。

  求出目标函数的最小值便可得到误分类点少的感知机模型,并且从目标函数中也可以看出目标函数中未知的变量只有ω,因此需要求出能使目标函数值最小的ω。

感知机最小化目标函数原始形式

  假设感知机的目标函数为

J(ω)=−∑xi∈Myi(ωTxi)

  为了求该函数的最小值一般使用梯度下降算法,首先通过该目标函数可以求出目标函数对ω的偏导为

ΔωJ(ω)=−∑xi∈Mxiyi

  在训练集中选取一个数据(xi,yi),设定ω=0,如果−yi(ωTxi)>0,则对ω使用随机梯度下降的迭代更新

ω=ω+αxiyi

  其中α(0<α≤1)是自定义的超参数称为学习率(learning rate)。

  通过对ω不断地更新直到训练集中没有误分类的点时更新停止。即可求出目标函数J(ω)的最小值,则该ω即最后感知机模型的最优ω。

  这种学习算法可以理解成,当实例点被误分类后,则调整ω的值,使超平面向靠误分类点的一侧移动,因此减少该误分类点与超平面间的距离,直至超平面越过该误分类点将其分类正确;当实例点分类正确,则不会更新ω。

感知机最小化目标函数对偶形式

  通过随机梯度下降算法可以得到了一个较好的感知机模型,但是如果样本特征较多或者误分类的数据较多,计算将成为该算法的最大的一个麻烦,接下来将介绍计算量较少的感知机最小化目标函数的对偶形式,通过该方法,将极大地减少计算量。

  假设误分类点(xi,yi)通过梯度下降算法修改ω共ni次,误分类点每次增量αxiyi,则ω的增量是αnixiyi,而正确分类点的ni则初始化为0,因此所有实例的总增量为

ω=∑i=1mαnixiyi

其中ni初始值为0,每当误分类点因误分类而梯度更新时则ni+1。

  通过误分类点的总增量公式即可得到一个新的感知机目标函数为

J(αni)=∑x=1myi(αnixiyix)=∑x=1mαnixix

  对目标函数使用梯度下降法求最小化目标函数,即对αni求偏导得

ΔαniJ(αni)=−∑x=1mα

  在训练集中选取一个点(xj,yj),设定α=0,ni=0,(i=1,2,⋯,m),如果−yi(αnixixj)>0,则对αni使用随机梯度下降的迭代更新

αni=αni+αni=ni+1(1)(2)

  通过对αni不断地更新直到训练集中没有误分类的点时更新停止。即可求出目标函数J(αni)的最小值,同时可以得到最优的∑mi=1αnixiyi,由于ω=∑mi=1αnixiyi即也可以得到感知机模型的最优ω。

  对偶形式中在判断误分类点的时候是计算xi,xj两个样本的内积,因此为了方便可以预先将训练集中样本之间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的Gram矩阵(Gram matrix),这也正是对偶形式比原始形式计算速度更快的原因之一。

感知机算法的收敛性

  感知机算法中所有误分类点到超平面的总距离为

−1||w||2∑xi∈Myi(wTxi)

  通常情况下默认||w||2为1(注:支持向量机会讲到为什么为1),即存在满足条件||w^opt||=1的超平面w^Toptx^=0将数据集完全正确分开,即当w^Toptx^>0,则yi>0;当w^Toptx^<0,则yi<0。因此一定存在γ>0,对任何一个样本(xi,yi)都有

yi(w^Toptx^)≥γ

  当1≥i≤n时R=max||xi^||,则感知机算法在训练集上的误分类次数k满足

k≤Rγ2

感知机流程

输入

  有m个实例n维特征的数据集

T={(x1,y1),(x2,y2),⋯,(xm,ym)}

其中xi是实例的特征向量即(xi(1),xi(2),⋯,xi(n))。

输出

  ω和感知机模型f(x)=sign(ωTx)。

原始形式流程

选取初值ω=0

训练集中选取数据(xi,yi),如果−yi(ωTxi)>0,则对ω使用梯度下降更新

ω=ω+αxiyi

重复步骤2,直至训练集中没有误分类点

得到最小化的目标函数J(ω),同时可以得到最优的ω∗,感知机模型为f(x)=sign(w∗Tx)

对偶形式流程

选取初值α=0,ni=0,(i=1,2,⋯,m)

训练集中选取数据(xj,yj),如果−yj(αnixixj)>0,则对αni使用梯度下降更新并更新该实例分类错误的次数ni

αni=αni+αni=ni+1(3)(4)

重复步骤2,直至训练集中没有误分类点

得到最小化的目标函数J(αni),同时可以得到最优的∑mi=1αnixiyi,由于ω=∑mi=1αnixiyi即也可以得到感知机模型的最优ω∗,感知机模型为f(x)=sign(w∗Tx)。

感知机优缺点

优点

简单易懂,编程实现容易

由于非线性支持向量机和神经网络等算法在此基础上改进的,感知机在一定程度上值得细细体会

缺点

目前在工业上使用的较少(太古老了,没辙!)

只能处理线性可分的数据(它的后代支持向量机和神经网络完美的解决了这个缺点)

无法解决回归问题(试着使用回归支持向量机?)

小结

  感知机算法最大的前提则是数据集需要线性可分,这也正是感知机算法最大的局限性。为了解决线性不可分数据的分类问题,因此在此感知机算法的基础上发明了非线性支持向量机、神经网络等机器学习算法。

  感知机算法虽然现在用的很少了,但是如果能深刻了解感知机算法的对偶形式为什么比原始形式更快的做到算法收敛会让你未来学习其他的机器学习算法轻松不少。

  感知机其实用到了部分线性模型知识,至于线性模型是什么,下一篇即会揭晓——线性回归。

抢先报名    优先占座