感知机是二类分类的线性分类模型,即输出为 和
二值,属于判别模型。感知机学习旨在将训练数据进行线性划分,有简单易实现的优点。感知机算法分为原始形式和对偶形式。
感知机模型的函数表示为
其中 为输入的实例的特征向量,
为输出的实例的类别。
和
为感知机模型参数,
叫做权值(weight)或权值向量,
叫做偏值(bias),
表示
和
的内积。
sign 是符号函数,即
感知机模型的假设空间是定义在特征空间的所有线性分类模型,即函数集合 。
(假设空间是指所有可能的模型的集合)
感知机可以理解为:所有训练样本在一个特征空间中, 是特征空间中的一个超平面
,它将特征空间划分为两个部分(正、负两类)。这个超平面
称为分离超平面(separating hyperplane)。
假设训练数据集是线性可分的(即可以找到超平面 将正负实例点完全分开),为了找到超平面
,我们可以定义一个(经验)损失函数并将损失函数极小化。(经验损失函数表示由所有训练样本的误差计算得到的损失函数)
感知机采用的损失函数是误分类点到超平面 的总距离。首先,特征空间中任意一点
到超平面
的距离为:
其中, 是
的
范式。
其次,对误分类的数据 ,
成立。
因此,误差分类点 到超平面
的距离是
于是,假设超平面 的误分类点集合为
,那么所有误分类点到超平面
的总距离为
不考虑 ,就得到感知机学习的 损失函数。
所以,感知机学习的损失函数为
显然,损失函数 。如果没有误分类点,损失函数为 0。误分类点越少,损失函数越小。于是我们需要选取使损失函数最小的模型参数
和
。
接下来是之前提到的两种感知机学习的算法:原始形式和对偶形式。
原始形式
已知感知机学习是找到使损失函数极小化的模型参数,即
所以感知机学习算法是由误分类驱动的,具体采用 随机梯度下降法:首先,任意选取一个超平面(即任意选取参数 和
),然后用梯度下降法不断地极小化目标函数(即损失函数)。在极小化过程中,每次随机选取一个误分类点使其梯度下降。
损失函数的梯度为
随机选取一个误分类点 ,对
和
进行更新:
其中 是步长,又称为 学习率(learning rate)。
于是,感知机学习算法的 原始形式 为:
- Input:训练数据集
,学习率
;
- Output:
,
,感知机模型
。
-
选取随机初始参数
和
;
-
选取训练集中样本
;
-
如果
,
-
重复 2、3 步,直到训练集中没有误分类点。
选择不同的初始参数,或者以不同的顺序选取误分类点,会得到不同的解。
根据定理 Novikoff 可知,误分类的次数是有上限的,所以经过有限次搜索可以找到将训练集完全正确分开的超平面。但为了得到唯一的超平面,需要对超平面增加约束条件,这就是线性支持向量机的想法。
对偶形式
对偶形式的基本想法是,将 和
表示为实例
和标记
的线性组合的形式,通过求解其系数从而求得
和
。
还是取初始值 和
,误分类点通过
修改 和
。
假设修改 次,则
和
关于
的增量分别是
和
,这里
。于是,最后学习得到的模型参数可表示为
这里 。当
时,表示第
个实例由于误分而进行更新的次数。实例更新次数越多,意味着它离超平面越近,也就越难正确分类。这样的实例对学习结构影响最大。
感知机学习算法的 对偶形式 为:
- Input:训练数据集
,学习率
;
- Output:
,
,感知机模型
,其中
。
-
令
,
;
-
选取训练集中样本
;
-
如果
,
(** 注意!** 这里的判断公式可以进行变形:
将上面的公式
带入
得到
合并后变为
在代码中我使用这个公式进行判断,因为如果直接用
会导致结果错误,这点我也不太清楚原因)
-
重复 2、3 步,直到训练集中没有误分类点。
对偶形式中训练实例只以内积的形式出现,可以先将所以训练数据的内积计算出来以矩阵形式储存,这就是 Gram 矩阵
(在对偶形式的应用中,,其中
)
在选择误分类点顺序一致时,对偶形式的解与原始形式一样。并且,对偶形式也存在多个解。
代码实现
已知正样本点 ,
,负样本点
,求感知机模型。
原始形式
1 | class PerceptronOrigin(): |
对偶形式
1 | class PerceptronDual(): |
参考文献
[1] 《统计学习方法(第二版)》李航