感知器(perceptron)是比较简单的二分类器,通过对训练样本集的学习,从而得到判别函数权值的解,产生线性可分的样本判别函数。该算法属于非参数算法,优点是不需要对各类样本的统计性质作任何假设,属于确定性方法。
虽然简单,感知器算法却是支持向量机(SVM)和神经网络算法的基础,为了之后更好地学习,感知器算法必须要了解地非常清楚。接下来,就开始介绍感知器算法。
给定一个训练数据集\(T = \{ ({x_1},{y_1}),({x_2},{y_3}), \cdots ,({x_N},{y_N})\} \),\({x_i} \in {R^n},{y_i} \in \{ - 1,1\} ,i = 1,2, \cdots N\),
分类模型为,
\[{h_\theta }(x) = g({\theta ^T}x + b)\]
其中θ是权值向量,x是输入向量,b是偏差,
\[g(z) = \left\{ \begin{array}{l}1{\rm{ \quad z}} \ge {\rm{0,}}\\{\rm{ - 1 \quad z < 0}}{\rm{.}}\end{array} \right.\]
直观上来看,对于一个对象而言,具有很多特征,这些特征对于我们的分类问题重要程度不一样,权值越大,表示这个特征和问题的相关性就越大;
偏差b的存在是为了表征那些被忽略的特征;
从几何上来看,偏差b的存在是为了使线性方程\({\theta ^T}x + b = 0\)能够取到所有分隔平面(当只有一个特征输入时,该方程是直线;当时两个特征输入时,该方程是平面;当特征输入大于等于3个时,该方程为超平面)。
所以,如果特征选择比较好的话,b就会很小,因为所选的特征已经能够很好地表征问题了;否则,b就会很大,表明了选择的特征并不好。
首先需要定义一个损失函数,在使损失函数最小化的过程中,得到我们的权值向量θ和偏差b。由于是分类问题,自然不能按照输出值和真实值的误差进行权值的更新,比如说分隔线方程的输出一个是0.1,另一个是10000,经过g(z)二值化后的输出都是1,但是其中却差别很大。
那么利用样本点到分隔平面的距离来进行更新权值似乎是一个不错的选择,点\({x_i}\)到分隔平面的距离为:
\[{L_1} = \frac{{\left| {{\theta ^T}{x_i} + b} \right|}}{{\left\| \theta \right\|}}\]
但是试想一下,权值向量θ和偏差b同时扩大同样的倍数,这个分隔平面并没有变,可是点到分隔平面的距离却变了,所以通常我们令‖θ‖=1,使权值不能随意扩大倍数,从而得到:
\[{L_2} = \left| {{\theta ^T}{x_i} + b} \right|\]
如何来表示这个绝对值呢?我们知道,对于分类正确的样本点是不需要对权值进行更新,那么只有误分类点才会更新权值。既然是误分类点,那么g(z)和真实值\({y_i}\)不相等,再由它们的取值范围{-1,1}可以得到- g(z)*{y_i}>0,也就是\( - ({\theta ^T}{x_i} + b)*{y_i} > 0\)。
则\({L_2}\)可以由\( - ({\theta ^T}{x_i} + b)*{y_i}\)代替。
所以,损失函数可以定义为,
\[L(\theta ,b) = - \sum\limits_{{x_i} \in M} {{y_i}({\theta ^T}{x_i} + b)} \]
其中M为误分类点的集合。
找到了损失函数,只需要使损失函数最小化就好了。
这里可以采用梯度下降法(由于篇幅问题,这里不再详细介绍,我会再写一篇文章详细介绍梯度下降法,有兴趣的同学,请持续关注),损失函数L(θ,b)对θ,b求导可以得出,
\begin{array}{l}{\nabla _\theta }L(\theta ,b) = - \sum\limits_{{x_i} \in M} {{y_i}{x_i}} \\{\nabla _b}L(\theta ,b) = - \sum\limits_{{x_i} \in M} {{y_i}} \end{array}
所以对于误分类点\(({x_i},{y_i})\),对θ,b更新为,
\begin{array}{l}\theta \leftarrow \theta + \eta {y_i}{x_i}\\b \leftarrow b + \eta {y_i}\end{array}
其中η称之为学习率,形象地理解,因为导数相当于方向,只有方向没有步长,是没办法移动的。
输入:训练数据集\(T = \{ ({x_1},{y_1}),({x_2},{y_3}), \cdots ,({x_N},{y_N})\} \),
其中\({x_i} \in {R^n},{y_i} \in \{ - 1,1\} ,i = 1,2, \cdots N\);学习率η(0≤η≤1);
输出:θ,b;感知器模型\({h_\theta }(x) = g({\theta ^T}x + b)\)。
(1) 选取初值\({\theta _0},{b_0}\)
(2) 在训练集中选取数据\(({x_i},{y_i})\)
(3) 如果\({y_i}({\theta ^T}{x_i} + b) \le 0\),
\[\begin{array}{l}\theta \leftarrow \theta + \eta {y_i}{x_i}\\b \leftarrow b + \eta {y_i}\end{array}\]
(4) 转至(2),直到训练集中没有误分类点。
感知器算法算法主要是针对线性可分的数据,但是当我们拿到比较复杂的数据时,并不能直接判断数据集是否线性可分,如果想要判断,这里可以提供一个思路:
(1)凭借经验来判断(这个对于没有实际经验的同学来说,很困难);
(2)判断不同样本的凸包,想象一下,正样本用一个圆包围起来,负样本用另一个圆包围起来,如果两个圆相交,那么这两种样本就不是线性可分,反之则是线性可分;当然凸包并不是用圆来表示的,这里只是为了形象地描述,想要了解凸包的同学,可以阅读相关论文。
当然,现实中的数据集大都不是线性可分的,所以感知器算法用得并不多,为了能够对线性不可分的数据进行分类,在感知器算法的基础上,产生了支持向量机和神经网络(超级强大的两种算法,在现实中应用很多)。
由于篇幅问题,感知器算法还有一部分将在另外一篇文章中介绍,主要是感知器算法收敛的问题,也就是为什么这个算法一定可以找到那个可以把线性可分的数据集分开的超平面;还有就是感知器的拓展,基于传统感知器算法衍生的各种算法,想要了解的同学,请持续关注。
[1] 刘建伟,申芳林,罗雄麟.感知器学习算法研究[J].计算机工程,2010,36(07):190-192.
[2] 李航. 统计学习方法[M]. 清华大学出版社,2012.
[3] Andrew. 斯坦福机器学习课程讲义