02-01 感知机

更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython

感知机

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

虽然感知机泛化能力不及其余的分类模型,可是若是可以对感知机的原理有必定的认识,在以后学习支持向量机、神经网络等机器学习算法的时候会轻松不少。编程

1、感知机学习目标

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

2、感知机引入

2.1 线性可分和线性不可分

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

假设因为传统思想的影响,男孩总会和男孩一块儿打打篮球,女孩总会和女孩一块儿踢毽子、跳跳绳,以下图所示。数据结构

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

png

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

若是某个男孩不听话跑到女孩那边去了,以下图右图所示,则没法经过一条直线可以把全部的男孩和女孩分开,则称男孩和女孩在操场上的分布是线性不可分的,即没法使用感知机算法完成该分类过程。机器学习

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

3、感知机详解

3.1 感知机模型

感知机是一个二分类线性模型,即输出为实例的类别,通常为其中一类称为正类\((+1)\),另外一类称为负类\((-1)\)。能够把上图所示的男孩\((+1)\)称为正类,女孩\((-1)\)称为负类。学习

假设有\(m\)个实例\(n\)维特征而且数据线性可分的数据集
\[ T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\} \]
它的输出空间即\(y\)的取值是\(y=\{+1,-1\}\)

因为数据线性可分,若是是二维空间,则总能找到一条直线将二维空间中的数据集分为两类,如上图所示的\(\omega{x}+b=0\),若是是三维空间,则能找到一个平面把三维空间中的数据集分为两类。对于上述的假设的数据集\(T\),则总能找到一个超平面\(S\)将该数据集分红两类,该超平面\(S\)能够记做
\[ \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b = 0 \]
其中若是假设\(\omega_0=b,x_0=1\),则超平面为
\[ \omega_0x_0 + \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n =0 \]
若是把上述公式使用向量来表示,则超平面为
\[ \omega^Tx = 0 \]
其中\(\omega,x\)都为\(n+1\)维的向量。

若是把\(\omega^Tx > 0\)内的数据集当作一类;把\(\omega^Tx < 0\)内的数据集当作另外一类,即经过\(\omega^Tx=0\)成功将数据集分为两类。为了将两个类别符号化,咱们可使用\(sign\)函数,由此便可获得感知机的模型为
\[ sign(\omega^Tx)= \begin{cases} 1, \quad \omega^Tx > 0 \\ -1, \quad \omega^Tx < 0 \end{cases} \]

3.2 感知机损失函数

假设有一个线性可分的数据集
\[ T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_i,y_i),\cdots,(x_m,y_m)\} \]
则数据集中的样本\(x_i\)到超平面\(S\)的距离为
\[ {\frac{|\omega^Tx_i|}{||\omega||}} \]
其中\(||\omega||\)为L2范数。

该距离公式源自于数学中点\((x_0,y_0)\)到面\(Ax+By+C=0\)的公式
\[ \frac{Ax_0+By_0+C}{\sqrt{A^2+B^2}} \]
假设存在一个误分类的样本\((x_i,y_i)\),对有误分类的样本都存在\(- y_i(\omega^Tx_i) > 0\)。由于误分类时当\(\omega^Tx_i = 1\)\(y_i = -1\);当\(\omega^Tx_i = -1\)\(y_i = 1\)。所以\(|\omega^Tx_i| = -y_i(\omega^Tx_i)\),则误分类点到超平面\(S\)的距离即损失函数为
\[ -{\frac{y_i(\omega^Tx_i)}{||\omega||}} \]

3.3 感知机目标函数

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

因为\(\omega^Tx_i=\omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b\),若是\(\omega\)\(b\)成比例的增长,即分子的\(\omega\)\(b\)扩大\(n\)倍时,分母的L2范数也将扩大\(n\)倍,也就是说分子和分母有固定的倍数关系,便可以将分子或分母固定为\(1\),而后求分子本身或分母的倒数的最小化做为新的目标函数。(此处讲解拿出\(b\),事实上\(b\)对结果的影响很小,后续会继续用向量的方式,而且忽略\(b\))。

感知机将分母\(||\omega||\)固定为\(1\),而后将分子的最小化做为目标函数,所以感知机的目标函数更新为
\[ J(\omega)=-\sum_{{x_i}\in{M}}y_i(\omega^Tx_i) \]
多说一嘴,支持向量机则是将分子固定位\(1\),而后将分母的倒数最小化做为目标函数。

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

求出目标函数的最小值即可获得误分类点少的感知机模型,而且从目标函数中也能够看出目标函数中未知的变量只有\(\omega\),所以须要求出能使目标函数值最小的\(\omega\)

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

假设感知机的目标函数为
\[ J(\omega)=-\sum_{{x_i}\in{M}}y_i(\omega^Tx_i) \]
为了求该函数的最小值通常使用梯度降低算法,首先经过该目标函数能够求出目标函数对\(\omega\)的偏导为
\[ \Delta_\omega{J(\omega)} = -\sum_{x_i\in{M}}x_iy_i \]
在训练集中选取一个数据\((x_i, y_i)\),设定\(\omega=0\),若是\(-y_i(\omega^Tx_i)>0\),则对\(\omega\)使用随机梯度降低的迭代更新
\[ \omega = \omega + \alpha{x_iy_i} \]
其中\(\alpha(0<\alpha\leq1)\)是自定义的超参数称为学习率(learning rate)

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

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

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

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

假设误分类点\((x_i,y_i)\)经过梯度降低算法修改\(\omega\)\(n_i\)次,误分类点每次增量\(\alpha{x_i}y_i\),则\(\omega\)的增量是\(\alpha{n_i}x_iy_i\),而正确分类点的\(n_i\)则初始化为\(0\),所以全部实例的总增量为
\[ \omega = \sum_{i=1}^m\alpha{n_i}x_iy_i \]
其中\(n_i\)初始值为\(0\),每当误分类点因误分类而梯度更新时则\(n_i+1\)

经过误分类点的总增量公式便可获得一个新的感知机目标函数为
\[ J(\alpha{n_i}) = \sum_{x=1}^my_i(\alpha{n_i}x_iy_ix) =\sum_{x=1}^m\alpha{n_i}x_ix \]
对目标函数使用梯度降低法求最小化目标函数,即对\(\alpha{n_i}\)求偏导得
\[ \Delta_{\alpha{n_i}}{J(\alpha{n_i})} = -\sum_{x=1}^m\alpha \]
在训练集中选取一个点\((x_j, y_j)\),设定\(\alpha=0, n_i=0, \quad (i=1,2,\cdots,m)\),若是\(-y_i(\alpha{n_i}x_ix_j)>0\),则对\(\alpha{n_i}\)使用随机梯度降低的迭代更新
\[ \begin{align} & \alpha{n_i} = \alpha{n_i} + \alpha \\ & n_i = n_i + 1 \end{align} \]
经过对\(\alpha{n_i}\)不断地更新直到训练集中没有误分类的点时更新中止。便可求出目标函数\(J(\alpha{n_i})\)的最小值,同时能够获得最优的\(\sum_{i=1}^m\alpha{n_i}x_iy_i\),因为\(\omega = \sum_{i=1}^m\alpha{n_i}x_iy_i\)即也能够获得感知机模型的最优\(\omega\)

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

3.6 感知机算法的收敛性

感知机算法中全部误分类点到超平面的总距离为
\[ -{\frac{1}{||w||_2}}\sum_{{x_i}\in{M}}y_i(w^Tx_i) \]
一般状况下默认\(||w||_2\)为1(注:支持向量机会讲到为何为1),即存在知足条件\(||\hat{w}_{opt}||=1\)的超平面\(\hat{w}_{opt}^T\hat{x}=0\)将数据集彻底正确分开,即当\(\hat{w}_{opt}^T\hat{x}>0\),则\(y_i>0\);当\(\hat{w}_{opt}^T\hat{x}<0\),则\(y_i<0\)。所以必定存在\(\gamma>0\),对任何一个样本\((x_i,y_i)\)都有
\[ y_i(\hat{w}_{opt}^T\hat{x})\geq\gamma \]
\(1\geq{i}\leq{n}\)\(R=max||\hat{x_i}||\),则感知机算法在训练集上的误分类次数\(k\)知足
\[ k\leq{\frac{R}{\gamma}}^2 \]

4、感知机流程

4.1 输入

\(m\)个实例\(n\)维特征的数据集
\[ T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\} \]
其中\(x_i\)是实例的特征向量即\(({x_i}^{(1)},{x_i}^{(2)},\cdots,{x_i}^{(n)})\)

4.2 输出

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

4.3 原始形式流程

  1. 选取初值\(\omega=0\)
  2. 训练集中选取数据\((x_i,y_i)\),若是\(-y_i(\omega^Tx_i)>0\),则对\(\omega\)使用梯度降低更新
    \[ \omega = \omega + \alpha{x_iy_i} \]
  3. 重复步骤2,直至训练集中没有误分类点
  4. 获得最小化的目标函数\(J(\omega)\),同时能够获得最优的\(\omega^*\),感知机模型为\(f(x)=sign({w^*}^Tx)\)

4.4 对偶形式流程

  1. 选取初值\(\alpha=0, n_i=0, \quad (i=1,2,\cdots,m)\)
  2. 训练集中选取数据\((x_j,y_j)\),若是\(-y_j(\alpha{n_i}x_ix_j)>0\),则对\(\alpha{n_i}\)使用梯度降低更新并更新该实例分类错误的次数\(n_i\)
    \[ \begin{align} & \alpha{n_i} = \alpha{n_i} + \alpha \\ & n_i = n_i + 1 \end{align} \]
  3. 重复步骤2,直至训练集中没有误分类点
  4. 获得最小化的目标函数\(J(\alpha{n_i})\),同时能够获得最优的\(\sum_{i=1}^m\alpha{n_i}x_iy_i\),因为\(\omega = \sum_{i=1}^m\alpha{n_i}x_iy_i\)即也能够获得感知机模型的最优\(\omega^*\),感知机模型为\(f(x)=sign({w^*}^Tx)\)。。

5、感知机优缺点

5.1 优势

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

5.2 缺点

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

6、小结

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

感知机算法虽然如今用的不多了,可是若是能深入了解感知机算法的对偶形式为何比原始形式更快的作到算法收敛会让你将来学习其余的机器学习算法轻松很多。

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

相关文章
相关标签/搜索