02-01 感知机

删除回忆录丶 提交于 2020-02-26 02:09:14

感知机

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

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

在这里插入图片描述

感知机学习目标

  1. 感知机模型
  2. 感知机的损失函数和目标函数
  3. 感知机原始形式和对偶形式
  4. 感知机流程
  5. 感知机优缺点

感知机引入

线性可分和线性不可分

在这里插入图片描述

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

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

# 感知机引入图例
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()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IpLeIFUM-1582628772276)(02-01%20%E6%84%9F%E7%9F%A5%E6%9C%BA_files/02-01%20%E6%84%9F%E7%9F%A5%E6%9C%BA_7_0.png)]

在这里插入图片描述

  从左图中也可以看出总能找到一条直线将男孩和女孩分开,即男孩和女孩在操场上的分布是线性可分的,此时该分隔直线为
ωx+b=0 \omega{x}+b=0
其中ω,b\omega,b是参数,xx是男孩和女孩共有的某种特征。

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

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

感知机详解

感知机模型

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

  假设有mm个实例nn维特征并且数据线性可分的数据集
T={(x1,y1),(x2,y2),,(xm,ym)} T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}
它的输出空间即yy的取值是y={+1,1}y=\{+1,-1\}

  由于数据线性可分,如果是二维空间,则总能找到一条直线将二维空间中的数据集分为两类,如上图所示的ωx+b=0\omega{x}+b=0,如果是三维空间,则能找到一个平面把三维空间中的数据集分为两类。对于上述的假设的数据集TT,则总能找到一个超平面SS将该数据集分成两类,该超平面SS可以记作
ω1x1+ω2x2++ωnxn+b=0 \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b = 0
其中如果假设ω0=b,x0=1\omega_0=b,x_0=1,则超平面为
ω0x0+ω1x1+ω2x2++ωnxn=0 \omega_0x_0 + \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n =0
如果把上述公式使用向量来表示,则超平面为
ωTx=0 \omega^Tx = 0
其中ω,x\omega,x都为n+1n+1维的向量。

  如果把ωTx>0\omega^Tx > 0内的数据集看成一类;把ωTx<0\omega^Tx < 0内的数据集看成另一类,即通过ωTx=0\omega^Tx=0成功将数据集分为两类。为了将两个类别符号化,我们可以使用signsign函数,由此即可得到感知机的模型为
sign(ωTx)={1,ωTx>01,ωTx<0 sign(\omega^Tx)= \begin{cases} 1, \quad \omega^Tx > 0 \\ -1, \quad \omega^Tx < 0 \end{cases}

感知机损失函数

  假设有一个线性可分的数据集
T={(x1,y1),(x2,y2),,(xi,yi),,(xm,ym)} T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_i,y_i),\cdots,(x_m,y_m)\}
则数据集中的样本xix_i到超平面SS的距离为
ωTxiω {\frac{|\omega^Tx_i|}{||\omega||}}
其中ω||\omega||为L2范数。

  该距离公式源自于数学中点(x0,y0)(x_0,y_0)到面Ax+By+C=0Ax+By+C=0的公式
Ax0+By0+CA2+B2 \frac{Ax_0+By_0+C}{\sqrt{A^2+B^2}}
  假设存在一个误分类的样本(xi,yi)(x_i,y_i),对有误分类的样本都存在yi(ωTxi)>0- y_i(\omega^Tx_i) > 0。因为误分类时当ωTxi=1\omega^Tx_i = 1yi=1y_i = -1;当ωTxi=1\omega^Tx_i = -1yi=1y_i = 1。因此ωTxi=yi(ωTxi)|\omega^Tx_i| = -y_i(\omega^Tx_i),则误分类点到超平面SS的距离即损失函数为
yi(ωTxi)ω -{\frac{y_i(\omega^Tx_i)}{||\omega||}}

感知机目标函数

  假设误分类点的集合为MM,那么所有误分类点到超平面SS的距离即感知机的目标函数为
J(ω)=xiMyi(ωTxi)ω J(\omega)=\sum_{{x_i}\in{M}} -{\frac{y_i(\omega^Tx_i)}{||\omega||}}
  给定了所有误分类点到超平面的距离,我们的目的就是优化上述公式,即最小化目标函数。

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

  感知机将分母ω||\omega||固定为11,然后将分子的最小化作为目标函数,因此感知机的目标函数更新为
J(ω)=xiMyi(ωTxi) J(\omega)=-\sum_{{x_i}\in{M}}y_i(\omega^Tx_i)
  多说一嘴,支持向量机则是将分子固定位11,然后将分母的倒数最小化作为目标函数。

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

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

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

  假设感知机的目标函数为
J(ω)=xiMyi(ωTxi) J(\omega)=-\sum_{{x_i}\in{M}}y_i(\omega^Tx_i)
  为了求该函数的最小值一般使用梯度下降算法,首先通过该目标函数可以求出目标函数对ω\omega的偏导为
ΔωJ(ω)=xiMxiyi \Delta_\omega{J(\omega)} = -\sum_{x_i\in{M}}x_iy_i
  在训练集中选取一个数据(xi,yi)(x_i, y_i),设定ω=0\omega=0,如果yi(ωTxi)>0-y_i(\omega^Tx_i)>0,则对ω\omega使用随机梯度下降的迭代更新
ω=ω+αxiyi \omega = \omega + \alpha{x_iy_i}
  其中α(0<α1)\alpha(0<\alpha\leq1)是自定义的超参数称为学习率(learning rate)

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

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

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

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

  假设误分类点(xi,yi)(x_i,y_i)通过梯度下降算法修改ω\omeganin_i次,误分类点每次增量αxiyi\alpha{x_i}y_i,则ω\omega的增量是αnixiyi\alpha{n_i}x_iy_i,而正确分类点的nin_i则初始化为00,因此所有实例的总增量为
ω=i=1mαnixiyi \omega = \sum_{i=1}^m\alpha{n_i}x_iy_i
其中nin_i初始值为00,每当误分类点因误分类而梯度更新时则ni+1n_i+1

  通过误分类点的总增量公式即可得到一个新的感知机目标函数为
J(αni)=x=1myi(αnixiyix)=x=1mαnixix J(\alpha{n_i}) = \sum_{x=1}^my_i(\alpha{n_i}x_iy_ix) =\sum_{x=1}^m\alpha{n_i}x_ix
  对目标函数使用梯度下降法求最小化目标函数,即对αni\alpha{n_i}求偏导得
ΔαniJ(αni)=x=1mα \Delta_{\alpha{n_i}}{J(\alpha{n_i})} = -\sum_{x=1}^m\alpha
  在训练集中选取一个点(xj,yj)(x_j, y_j),设定α=0,ni=0,(i=1,2,,m)\alpha=0, n_i=0, \quad (i=1,2,\cdots,m),如果yi(αnixixj)>0-y_i(\alpha{n_i}x_ix_j)>0,则对αni\alpha{n_i}使用随机梯度下降的迭代更新
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ & \alpha{n_i} …
  通过对αni\alpha{n_i}不断地更新直到训练集中没有误分类的点时更新停止。即可求出目标函数J(αni)J(\alpha{n_i})的最小值,同时可以得到最优的i=1mαnixiyi\sum_{i=1}^m\alpha{n_i}x_iy_i,由于ω=i=1mαnixiyi\omega = \sum_{i=1}^m\alpha{n_i}x_iy_i即也可以得到感知机模型的最优ω\omega

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

在这里插入图片描述

感知机算法的收敛性

在这里插入图片描述

  感知机算法中所有误分类点到超平面的总距离为
1w2xiMyi(wTxi) -{\frac{1}{||w||_2}}\sum_{{x_i}\in{M}}y_i(w^Tx_i)
  通常情况下默认w2||w||_2为1(注:支持向量机会讲到为什么为1),即存在满足条件w^opt=1||\hat{w}_{opt}||=1的超平面w^optTx^=0\hat{w}_{opt}^T\hat{x}=0将数据集完全正确分开,即当w^optTx^>0\hat{w}_{opt}^T\hat{x}>0,则yi>0y_i>0;当w^optTx^<0\hat{w}_{opt}^T\hat{x}<0,则yi<0y_i<0。因此一定存在γ>0\gamma>0,对任何一个样本(xi,yi)(x_i,y_i)都有
yi(w^optTx^)γ y_i(\hat{w}_{opt}^T\hat{x})\geq\gamma
  当1in1\geq{i}\leq{n}R=maxxi^R=max||\hat{x_i}||,则感知机算法在训练集上的误分类次数kk满足
kRγ2 k\leq{\frac{R}{\gamma}}^2

感知机流程

输入

  有mm个实例nn维特征的数据集
T={(x1,y1),(x2,y2),,(xm,ym)} T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}
其中xix_i是实例的特征向量即(xi(1),xi(2),,xi(n))({x_i}^{(1)},{x_i}^{(2)},\cdots,{x_i}^{(n)})

输出

  ω\omega和感知机模型f(x)=sign(ωTx)f(x)=sign(\omega^Tx)

原始形式流程

  1. 选取初值ω=0\omega=0
  2. 训练集中选取数据(xi,yi)(x_i,y_i),如果yi(ωTxi)>0-y_i(\omega^Tx_i)>0,则对ω\omega使用梯度下降更新
    ω=ω+αxiyi \omega = \omega + \alpha{x_iy_i}
  3. 重复步骤2,直至训练集中没有误分类点
  4. 得到最小化的目标函数J(ω)J(\omega),同时可以得到最优的ω\omega^*,感知机模型为f(x)=sign(wTx)f(x)=sign({w^*}^Tx)

对偶形式流程

  1. 选取初值α=0,ni=0,(i=1,2,,m)\alpha=0, n_i=0, \quad (i=1,2,\cdots,m)
  2. 训练集中选取数据(xj,yj)(x_j,y_j),如果yj(αnixixj)>0-y_j(\alpha{n_i}x_ix_j)>0,则对αni\alpha{n_i}使用梯度下降更新并更新该实例分类错误的次数nin_i
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ & \alpha{n_i} …
  3. 重复步骤2,直至训练集中没有误分类点
  4. 得到最小化的目标函数J(αni)J(\alpha{n_i}),同时可以得到最优的i=1mαnixiyi\sum_{i=1}^m\alpha{n_i}x_iy_i,由于ω=i=1mαnixiyi\omega = \sum_{i=1}^m\alpha{n_i}x_iy_i即也可以得到感知机模型的最优ω\omega^*在这里插入图片描述感知机模型为f(x)=sign(wTx)f(x)=sign({w^*}^Tx)

感知机优缺点

优点

  1. 简单易懂,编程实现容易
  2. 由于非线性支持向量机和神经网络等算法在此基础上改进的,感知机在一定程度上值得细细体会

缺点

  1. 目前在工业上使用的较少(太古老了,没辙!)
  2. 只能处理线性可分的数据(它的后代支持向量机和神经网络完美的解决了这个缺点)
  3. 无法解决回归问题(试着使用回归支持向量机?)

小结

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

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

  感知机其实用到了部分线性模型知识,至于线性模型是什么,下一篇即会揭晓——线性回归。
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!