1 概述

感知机(preceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。
感知机1957年由Rosenblatt提出,是神经网络与支持向量机的基础。

2 算法

2.1 模型

定义2.1(感知机) 假设输入空间(特征空间)是01 Perceptron-感知机 - 图1,输出空间是01 Perceptron-感知机 - 图2。输入01 Perceptron-感知机 - 图3表示实例的特征向量,对应输入空间(特征空间)的点;输出01 Perceptron-感知机 - 图4表示实例的类别。由输入空间到输出空间的如下函数:
01 Perceptron-感知机 - 图5 (2.1)
称为感知机。其中,01 Perceptron-感知机 - 图601 Perceptron-感知机 - 图7为感知机模型参数,01 Perceptron-感知机 - 图8叫做权值(weight)或权值向量(weight vector),01 Perceptron-感知机 - 图9叫作偏置(bias),01 Perceptron-感知机 - 图10表示01 Perceptron-感知机 - 图1101 Perceptron-感知机 - 图12的内积。01 Perceptron-感知机 - 图13是符号函数,即
01 Perceptron-感知机 - 图14 (2.2)
感知机是一种线性分类模型,属于判别模式。感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classfication model)或线性分类器(linear classifier),即函数集合01 Perceptron-感知机 - 图15
感知机有如下集合解释:线性方程
01 Perceptron-感知机 - 图16 (2.3)
对应于特征空间01 Perceptron-感知机 - 图17中的一个超平面01 Perceptron-感知机 - 图18,其中01 Perceptron-感知机 - 图19是超平面的法向量,01 Perceptron-感知机 - 图20是超平面的截距。这个超平面将特征空间划分为两部分。位于两部分的点(特征向量)分别被分为正、负两类。因此,超平面01 Perceptron-感知机 - 图21成为分离超平面(separating hyperplane),如图2.1所示。
感知机学习,有训练数据集(实例的特征向量机及类别)
01 Perceptron-感知机 - 图22
其中,01 Perceptron-感知机 - 图23,求得感知机模型(2.1),即求得模型参数01 Perceptron-感知机 - 图2401 Perceptron-感知机 - 图25。感知机预测,通过学习得到的感知机模型,对于新的输入实例给出其对应的输出类别。

2.2 感知机学习策略

数据集的线性可分性

定义2.2(数据集的线性可分性) 给定一个数据集
01 Perceptron-感知机 - 图26
其中,01 Perceptron-感知机 - 图27,如果存在某个超平面01 Perceptron-感知机 - 图28
01 Perceptron-感知机 - 图29
能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有01 Perceptron-感知机 - 图30的实例01 Perceptron-感知机 - 图31,有01 Perceptron-感知机 - 图32,对所有01 Perceptron-感知机 - 图33的实例01 Perceptron-感知机 - 图34,有01 Perceptron-感知机 - 图35,则称数据集01 Perceptron-感知机 - 图36为线性可分数据集(linearly separable data set);否则,称数据集01 Perceptron-感知机 - 图37线性不可分。

感知机学习策略

假设训练数据是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。为了找出这样的超平面,即确定感知机模型01 Perceptron-感知机 - 图3801 Perceptron-感知机 - 图39,需要确定一个学习策略,及定义(经验)损失函数并将损失函数极小化。
损失函数的一个自然选择是误分类点的个数。但是,这样损失函数是不是参数01 Perceptron-感知机 - 图4001 Perceptron-感知机 - 图41的连续可导函数,不易优化。损失函数的另一个选择是误分类点到超平面01 Perceptron-感知机 - 图42的总距离,这是感知机所采用的。为此,首先写出输入空间01 Perceptron-感知机 - 图43中任一点01 Perceptron-感知机 - 图44到超平面01 Perceptron-感知机 - 图45的距离:
01 Perceptron-感知机 - 图46
这里,01 Perceptron-感知机 - 图4701 Perceptron-感知机 - 图4801 Perceptron-感知机 - 图49范数。
其次,对于误分类的数据01 Perceptron-感知机 - 图50来说,
01 Perceptron-感知机 - 图51
成立。因为当01 Perceptron-感知机 - 图52时,01 Perceptron-感知机 - 图53;而当01 Perceptron-感知机 - 图54时,01 Perceptron-感知机 - 图55;因此,误分类点01 Perceptron-感知机 - 图56到超平面01 Perceptron-感知机 - 图57的距离是
01 Perceptron-感知机 - 图58
这样,假设超平面01 Perceptron-感知机 - 图59的误分类点集合为01 Perceptron-感知机 - 图60,那么所有误分类点到超平面01 Perceptron-感知机 - 图61的总距离为
01 Perceptron-感知机 - 图62
不考虑01 Perceptron-感知机 - 图63,就得到感知机学习的损失函数。
给定训练数据集

01 Perceptron-感知机 - 图64
其中,01 Perceptron-感知机 - 图65。感知机01 Perceptron-感知机 - 图66学习的损失函数定义为
01 Perceptron-感知机 - 图67 (2.4)
其中01 Perceptron-感知机 - 图68为误分类点的集合。这个损失函数就是感知机学习的经验风险函数。
显然,损失函数01 Perceptron-感知机 - 图69是非负的。如果没有误分类点,损失函数是0。而且,误分类点越少,误分类点离超平面越近,损失函数值就越小。一个特定的样本点的损失函数:在误分类时是参数01 Perceptron-感知机 - 图7001 Perceptron-感知机 - 图71的线性函数,在正确分类时是0。因此,给定训练数据集01 Perceptron-感知机 - 图72,损失函数01 Perceptron-感知机 - 图7301 Perceptron-感知机 - 图7401 Perceptron-感知机 - 图75的连续可导函数。
感知机学习的策略是在假设空间中选取使损失函数式 (2.4)最小的模型参数01 Perceptron-感知机 - 图7601 Perceptron-感知机 - 图77,即感知机模型。

2.3 感知机学习算法

感知机学习问题转换为求解损失函数式(2.4)的最优化问题,最优化的方法是随机梯度下降法。

感知机学习算法的原始形式

感知机学习算法是对一下最优化问题的算法。给定一个训练数据集
01 Perceptron-感知机 - 图78
其中,01 Perceptron-感知机 - 图79,求参数01 Perceptron-感知机 - 图8001 Perceptron-感知机 - 图81,使其为以下损失函数极小化问题的解
01 Perceptron-感知机 - 图82 (2.5)
其中01 Perceptron-感知机 - 图83为误分类点的集合。
感知机学习算法是误分类驱动的,具体采用随机梯度下降算法(stochastic gradient descent)。首先,任意选取一个超平面01 Perceptron-感知机 - 图84,然后用梯度下降法不断地极小化目标函数(2.5)。极小化过程不是一次使01 Perceptron-感知机 - 图85中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。
假设误分类点集合M是固定的,那么损失函数01 Perceptron-感知机 - 图86的梯度由
01 Perceptron-感知机 - 图87
随机选取一个误分类点01 Perceptron-感知机 - 图88,对01 Perceptron-感知机 - 图89进行更新:
01 Perceptron-感知机 - 图90

式中01 Perceptron-感知机 - 图91是步长,在统计学习中又称为学习率(learing rate)。这样,通过迭代可以期待损失函数01 Perceptron-感知机 - 图92不断减少,直至为0。综上所述,得到如下算法;
算法2.1(感知机学习算法的原始形式)
输入:训练数据集01 Perceptron-感知机 - 图93,其中01 Perceptron-感知机 - 图9401 Perceptron-感知机 - 图9501 Perceptron-感知机 - 图96;学习率01 Perceptron-感知机 - 图97
输出:01 Perceptron-感知机 - 图98;感知机模型01 Perceptron-感知机 - 图99
(1)选取初始值01 Perceptron-感知机 - 图100;
(2)在训练集中选取数据01 Perceptron-感知机 - 图101
(3)如果01 Perceptron-感知机 - 图102
01 Perceptron-感知机 - 图103 (2.6)
01 Perceptron-感知机 - 图104 (2.7)
(4)转至(2),直至训练集中没有误分类点
这种学习算法直观上有如下解释:当一个实例点被误分类,即位于分离平面的错误一侧时,则调整01 Perceptron-感知机 - 图105的值,使分离超平面向该误分类点的一侧移动,以减少该误差分类点与超平面的距离,直至超平面越过该误分类点使其被正确分类。
算法2.1是感知机学习的基本算法,对于后面的对偶形式,成为原始形式。感知机学习算法简单且易于实现。

算法的收敛性

现在证明,对于现行可分数据集感知学习算法原始形式收敛,即经过有限次迭代可以得到一个将训练数据集完全正确划分的分离超平面及感知机模型。
为了便于叙述与推导,将偏置01 Perceptron-感知机 - 图106并入权重向量01 Perceptron-感知机 - 图107,记作01 Perceptron-感知机 - 图108,同样也将输入向量加以扩充,加进常数1,记作01 Perceptron-感知机 - 图109。这样,01 Perceptron-感知机 - 图110。显然,01 Perceptron-感知机 - 图111
定理2.1(novikoff) 设训练数据集01 Perceptron-感知机 - 图112是线性可分的,其中01 Perceptron-感知机 - 图11301 Perceptron-感知机 - 图11401 Perceptron-感知机 - 图115,则
(1)存在满足条件01 Perceptron-感知机 - 图116的超平面01 Perceptron-感知机 - 图117将训练数据集完全正确分开;且存在01 Perceptron-感知机 - 图118,对所有01 Perceptron-感知机 - 图119
01 Perceptron-感知机 - 图120 (2.8)
(2)令01 Perceptron-感知机 - 图121,则感知机算法在2.1在训练集上的误分类次数01 Perceptron-感知机 - 图122满足不等式
01 Perceptron-感知机 - 图123 (2.9)
证明 (1)由于训练数据集是线性可分的,按照定义2.2,存在超平面可将训练数据集完全正确分开,取此超平面为01 Perceptron-感知机 - 图124,使01 Perceptron-感知机 - 图125。由于对于有限的01 Perceptron-感知机 - 图126,均有
01 Perceptron-感知机 - 图127
所以存在
01 Perceptron-感知机 - 图128
使
01 Perceptron-感知机 - 图129
(2)感知机算法从01 Perceptron-感知机 - 图130开始,如果实例被误分类,则更新权重。零01 Perceptron-感知机 - 图131是第01 Perceptron-感知机 - 图132个误分类实例之前的扩充权重向量,即
01 Perceptron-感知机 - 图133
则第k个误分类实例的条件是
01 Perceptron-感知机 - 图134 (2.10)
01 Perceptron-感知机 - 图135是被01 Perceptron-感知机 - 图136误分类的数据,则01 Perceptron-感知机 - 图13701 Perceptron-感知机 - 图138的更新是
01 Perceptron-感知机 - 图139
01 Perceptron-感知机 - 图140

01 Perceptron-感知机 - 图141 (2.11)
下面推导两个不等式(2.12)及(2.13)
由式(2.11)及式(2.8)得
01 Perceptron-感知机 - 图142
由此递推得出不等式(2.12)
01 Perceptron-感知机 - 图143 (2.12)
01 Perceptron-感知机 - 图144 (2.13)
由式(2.11)及式(2.10)得
01 Perceptron-感知机 - 图145
结合不等式(2.12)及式(2.13)即得
01 Perceptron-感知机 - 图146
定理表明,误分类的次数01 Perceptron-感知机 - 图147是有上限的,经过优先次搜索可以找到将训练数据完全正确分开的分离超平面。也就是说,当训练数据集线性可分时,感知机学习算法原始形式迭代是收敛的。但是感知机算法存在许多解,这些解依赖于初值的选择,也依赖于迭代过程中误分类点的选择顺序。为了得到唯一的超平面,需要对分离超平面增加约束条件。这是后面要讲述的线性支持向量机的想法。当训练集线性不可分时,感知机学习算法不收敛,迭代结果会发生震荡。

感知机学习算法的对偶形式

现在考虑感知机学习算法的对偶形式。感知机学习算法的原始形式和对偶形式与支持向量机学习算法的原始形式和对偶形式相对应。
对偶形式的基本想法是,将01 Perceptron-感知机 - 图14801 Perceptron-感知机 - 图149表示为实例01 Perceptron-感知机 - 图150和标记01 Perceptron-感知机 - 图151的线性组合形式,通过求解其系数而求得01 Perceptron-感知机 - 图15201 Perceptron-感知机 - 图153。不是一般性,在算法2.1中可假设初始值01 Perceptron-感知机 - 图154均为0.对误分类点01 Perceptron-感知机 - 图155的增量分别是01 Perceptron-感知机 - 图15601 Perceptron-感知机 - 图157,这里01 Perceptron-感知机 - 图158。这样,从学习过程不难看书,最后学习得到的01 Perceptron-感知机 - 图159可以分别表示为
01 Perceptron-感知机 - 图160 (2.14)
01 Perceptron-感知机 - 图161 (2.15)
这里,01 Perceptron-感知机 - 图162,当01 Perceptron-感知机 - 图163时,表示第01 Perceptron-感知机 - 图164个实例点由于误分而进行更新的次数。实例点更新次数越多,意味着它距离分离超平面越近,也就越难正确分类,换句话说,这样的实例对学习结果影响最大。
下面对照原始形式来叙述感知机学习算法的对偶形式。
算法2.2(感知机学习算法的对偶形式)
输入:训练数据集01 Perceptron-感知机 - 图165,其中01 Perceptron-感知机 - 图16601 Perceptron-感知机 - 图16701 Perceptron-感知机 - 图168;学习率01 Perceptron-感知机 - 图169
输出:01 Perceptron-感知机 - 图170;感知机模型01 Perceptron-感知机 - 图171,其中01 Perceptron-感知机 - 图172
(1)01 Perceptron-感知机 - 图173
(2)在训练集中选取数据01 Perceptron-感知机 - 图174
(3)如果01 Perceptron-感知机 - 图175
01 Perceptron-感知机 - 图176
01 Perceptron-感知机 - 图177
(4)转至(2),直至没有误分类数据
对偶形式中训练形式仅以内积的形式出现。为了方便,可以预先将训练集中实例间的内积计算出来并以矩阵的形式存储,这个举证就是所谓的Gram举证(Gram matrix)
01 Perceptron-感知机 - 图178

3 实现

3.1 原始算法实现(基于sklearn)

  1. import numpy as np
  2. class Perceptron(object):
  3. def __init__(self, eta=1, max_iteration=100):
  4. self.max_iteration = max_iteration
  5. self.eta = eta
  6. self.w_ = None
  7. self.b_ = None
  8. def _sign(self, x):
  9. """
  10. 对特征向量取符号函数
  11. :param x:特征向量
  12. :return: 分类符号
  13. """
  14. return 1 if np.dot(x, self.w_) + self.b_ > 0 else -1
  15. def fit(self, x_train, y):
  16. assert len(x_train) == len(y), \
  17. "the size of x_train must be equal to the size of y_train"
  18. self.w_ = np.array([0.0] * (len(x_train[0]))) # 取初值 w=[0,0,..,0] b=0
  19. self.b_ = 0
  20. cnt = 0
  21. length = len(x_train)
  22. while cnt < self.max_iteration: # 迭代次数限制条件
  23. cnt += 1
  24. error_cnt = 0 # 没有错误时则跳出循环
  25. for i in range(length):
  26. tem_y = self._sign(x_train[i, :])
  27. if tem_y * y[i] <= 0: # 若存在误差变量
  28. error_cnt += 1
  29. tmp = self.eta * y[i] * x_train[i, :]
  30. tmp = tmp.reshape(self.w_.shape)
  31. self.w_ = tmp + self.w_ # w权值更新
  32. self.b_ = self.b_ + y[i] # b偏置更新
  33. print('第%d次迭代:\n更新后参数 w 为%s,b 为%s' % (cnt, str(self.w_), str(self.b_)))
  34. break
  35. if error_cnt == 0:
  36. print("训练完成,第%d次迭代时退出" % cnt)
  37. break
  38. def predict(self, x_predict):
  39. """结果待预测数据集x_predict,返回表示x_predict的结果向量"""
  40. assert self.w_ is not None and self.b_ is not None, \
  41. "must fit before predict"
  42. return np.array([self._sign(x) for x in x_predict])
  43. def __repr__(self):
  44. return "Perceptron(w=%s,b=%s)" % (self.w_, self.b_)
  45. def create_data():
  46. X_train = np.array([[1, 1], [3, 3], [4, 3]])
  47. y = [-1, 1, 1]
  48. return X_train, y
  49. if __name__ == '__main__':
  50. X_train, y = create_data()
  51. p = Perceptron()
  52. p.fit(X_train, y)
  53. print(p.__repr__())

3.2 对偶形式实现(待实现)

4 实践

4.1 一般使用流程

4.2 超参数和模型参数

4.3 基于scikit-learn的使用

5 问题集合

1. Minsky与Papert指出:感知机因为是线性模型,所以不能表示复杂的函数,如异或(XOR)。验证感知机为什么不能表示异或。
2.模仿例题1,构建从训练数据集求解感知机模型的例子。
3.证明以下定理:样本集线性可分的充分必要条件是正实例点所构成的凸壳与负实例点集所构成的凸壳互不相较。

6 继续阅读

详见《统计机器学习》第二版01 Perceptron-感知机 - 图179参考文献

CHANGELOG

2020年12月19日11:50:22
第一版更新,参考自《统计机器学习》第二版 01 Perceptron-感知机 - 图180-01 Perceptron-感知机 - 图181