优质博文:IT-BLOG-CN
1、模型形式
感知机模型主要用于解决二分类问题,即响应变量Y是个二分类变量(如性别)。其基本思想是拟找出一个超平面S
,将样本空间中的训练集分为两个部分,使得位于超平面S
合一侧的点具有相合的Y值。
模型的具体形式如下:
其中sign(.)
为符号函数:
该模型本质上和统计学中的线性模型类似,只不过我们通常用线性模型解决回归问题(即响应变量Y为连续变量),用广义线性模型(GLM
,如Logistic
模型)解决分类问题。
显然运用感知机模型的前提是训练样本空间是线性可分的:即存在某个超平面S
可以将训练样本空间中的两类样本点完全正确地划分到S
的两侧。
也说明了在后面运用梯度下降法求最优参数时,一旦当前参数满足这个前提条件就可以停止对参数的更新迭代了。
2、损失函数
给出模型的具体形式后,为了求最优参数还需设定相应的损失函数。分类问题中损失函数的一个自然选择是误分类点的总数,但是考虑到这样的损失函数对于参数w
,b
而言并非是个连续可导函数,而针对某个误分类点有:
该指标被称为函数距离(函数间隔),显然所有误分类点的函数距离和在一定程度上可以反映出模型分类效果的好坏(越小模型越好)。因此定义感知机模型的损失函数为:
其中M
表示在当前超平面S
下被误分类的点集合。
3、模型求解
这里采用梯度下降法Gradient descent
求解感知机模型中的最优参数。对损失函数L
求导得到梯度向量:
接着采用随机梯度下降法,给定学习率k
后,在误分类点集M中随机抽取一个点对参数进行更新:
需要注意的是,使用上述损失函数的感知机模型如果采用不同的参数初始值或选取不合的误分类点就会得到不合的参数最优解(存在不止一个超平面S
可以完全正确划分训练样本空间)。
综上所述,下面给出感知机模型的具体算法步骤:
输入:训练数据集T
,学习率k
;
输出:w
,b
以及模型y=wx+b
(1)选取初始化参数w0
,b0
(2)遍历训练集中的数据(x0,y0)
(3)如果yi(wxi+b)<0
,则对当前参参数进行整:
跳转至(2)
,直至训练集中没有误分类点停止迭代并输出当前参数w
,b
。
上述算法中的一些细节步骤还是与之前理论部分有差别:比如理论中的随机梯度下降法是使用一个随机误分类点进行优化参数,这就要求每次迭代前都要找出当前参数下的误分类点集,然后在这些点中随机抽取一个样本点更新参数。但在上述的算法中把查找误分类点和跟新参数合步进行,即在遍历训练集时每找到一个误分类点就马上利用该点更新参数。这么做的原因在于:一方面如果采取先找误分类点集再随机抽取的方式,查找那些未参与参数更新时的误分类点所耗的时间白白浪费;另一方面边遍历边更新参数的做法可以保证在给定训练样本和参数初始值的情况下,输出的解唯一。
除了上述的算法,感知机模型还有一个对偶形式的算法,可以参考李航老师的《统计学习方法》。
4、代码实现
下面给出一个有关感知机例子的python
代码,主要使用numpy
库和pandas
库。以鸢尾花数据前100
行观测作为样本空间。(数据来源参考了https://www.cnblogs.com/scikit-learn/p/6973497.html
)
取第 1
列和第3
列构造一个二维特征变量X
,取第5
列作为响应变量Y
:
数据的具体形式如下:
还要写一个在当前参数下判断是否为误分类点的函数cal()
:
以及一个用于更新参数的函数update()
:
最后通过样本数据集计算感知机模型的参数:
最织得到如下结果:
对应的感知机模型为:
然后将散样本点投影至Y=0
平面,并画出超平面不Y=0
平面的交线,使结果更加直观: