定义: 假设输入空间(特征空间)是
,输出空间是
,输入
表示实例的特征向量,对应于输入空间(特征空间)的点,输出
表示实例的类别,由输入空间到输出空间的如下函数:
称为感知机。其中,w和b为感知机模型参数,
叫作权值(weigh)或权值向量(weigh vector),
叫作偏置(bias),
表示w和x的内积。sign是符号函数,即
感知机模型的假设空间:定义在特征空间中的所有线性分类模型(linear classification model)或线性分类器(linear classifier)即函数集合:
感知机有如下几何解释:线性方程
对应于特征空间
中的一个超平面S,其中w是超平面的法向量,b是超平面的截距。这个超平面将特征空间划分为两个部分,位于两部分的点(特征向量)分别被分为正、负两类。因此超平面S称为分离超平面(separating hypeplane),如下图。
损失函数:误分类点到超平面S的总距离。其中输入空间
中任一点 到超平面S的距离
这里
是w的
范数。
其次,对于误分类的数据
来说
成立,因为
时,
, 而当
时,
,因此,误分类点
到超平面S的距离是:
这样,假设超平面的S的误分类集合为M,那么所有误分类点到超平面S的总距离为:
不考虑
,就得到感知机学习的损失函数。
求感知机模型参数w和b,转化为以下损失函数极小化问题解:
其中M为误分类点的集合。
感知机学习算法是误分类驱动的,具体采用随机梯度下降法(stochastic gradient descent)。首先,任意选取一个超平面
,
,然后用梯度下降法不断极小化损失函数。极小化过程中不是一次使M中所有误分类点的梯度下降而是一次随机选取一个误分类点使其梯度下降。
假设误分类点集合M是固定的,那么损失函数
的梯度由
给出,随机选取一个误分类点
,对w,b进行更新:
式中
是步长,在统计学中又称为学习率(learning rate)。这样,通过迭代可以期待损失函数不断减少,直到为0。综上,得到如下算法:
(1)选取初值
(2)在训练集中选取数据
(3)如果
(4)转之(2)直到训练集中没有误分类点。
代码实现:此部分分为两部分,第一部分为手撸感知机,第二部分为基于skleran来实现感知机。
第一部分:手撸感应机代码
加载需要用的库,其中time用来计算程序运行的时间不必在意。
产生数据集,其中数据的第一个值为1,是将偏置b并入权重向量w,记作
,同样也将输入向量加以扩充,加进常数1记作
, 产生。
产生测试数据
定义符号函数
定义pla函数,其中首先将训练数据用mat函数转化成矩阵,为后面做线性运算做准备,同理将标签转化成矩阵并转置,在通过shape函数获得训练数据大小(在此处m为6,n为3)并初始化w。在通过while语句设定条件,在其中遍历每个数据,计算值是否与标签一直,如果一致则继续下一个,不一致,则修改w,当遍历全部数据后,没有错误的值时,结束,最后返回w。
定义一个画散点图函数。
定义预测函数
运用预测函数进行预测。并把结果记在predict中。
定义一个main函数,将前面的函数整合。
运行程序。,得出结果。
结果解释,图下面的依次为w与预测结果。
第二部分:基于skleran实现。由于实现过程过于同一,且网络上存在许多类似的,在此只介绍思路:
(1)通过sklearn中的make_classification来产生样本。
(2)将生成的样本分为训练数据和测试数据,同时将其中的正例和反例也分开。
(3)从sklearn.linear_model加载模型,运用训练数据训练感知机模型,得出感知机模型。具体参数查看
(http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Perceptron.html#sklearn.linear_model.Perceptron)
(4)图示化。