感知机是一种很传统和经典的分类算法了,现在机器学习的书基本上也很少详细讲了,大多还会简单介绍一下。看 ng 的机器学习课程,在讲 SVM 支持向量机的时候,从逻辑回归的代价函数直接修改到SVM的代价函数,实在难以理解,逻辑回归和SVM之间的关系和区别,还得好好想想
感知机模型有自身的局限性,它只能做线性分类。如果数据不是线性可分的,那还真没办法。但是了解感知机模型,对后面学习SVM很有帮助的
1. 感知机模型
感知机只能用来做线性分类,所谓线性分类是说,假设我们有一堆样本数据,我们必须找到一条线或者一个超平面,能把这堆样本划分到线的两边
用数学的语言来说,如果我们有m个样本,每个样本对应于n维特征和一个二元类别输出,如下:
(x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m)我们的目标是找到这样一个超平面,即:
\theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n} = 0让其中一种类别的样本都满足\theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n} > 0,让另一种类别的样本都满足\theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n} < 0 ,从而得到线性可分。如果数据线性可分,这样的超平面一般都不是唯一的,也就是说感知机模型可以有多个解(而SVM模型就是要从这多个解里面找一个最好的)
我们可以把这个超平面简化成
f(x)=sign(w \cdot {x}+b)其中w和x都是向量,b是超平面的偏移。因此,感知机的模型可以定义为:
sign(x)= \begin{cases} -1& {x<0}\\ 1& {x\geq 0} \end{cases}对于wx + b > 0的样本,恒有y>=0,对于wx + b < 0的样本,恒有y<0
2. 损失函数
损失函数的一个自然选择是误分类点的总数,但是这样的损失函数不是参数w和b的连续可导函数,不易优化。另外一种选择是所有误分类点到超平面的总距离
备注:我对这个地方还是比较困惑的。为啥不是所有分类点到超平面的距离最小?只看误分类点计算出来的模型参数,未必是最优的吧。损失函数作为机器学习的目标,只看误分类点会不会有问题。但是目前看大家都是这么理解的,姑且先这么理解
超平面外的任意一个点到超平面的距离可以定义为 \frac{|w \cdot x_0 + b|}{||w||}
其中||w||是w的L2范数,也叫欧式距离,||w|| = \sqrt{w_0^2 + w_1^2 + ... + w_n^2}
假设我们把满足wx + b > 0的样本输出定义为1,把满足wx + b < 0的样本输出定义为-1。那么所有误分类点到超平面的距离之和为,M 是所有误分类点的集合:
J = \frac {{}-\sum_{x_i \in M} y_i(w*x_i + b)} {||x||}这里面由于分子分母都含有w变量,并且分子的w和分母的||w||是具有正相关性的,因此对于求解最小代价函数来说,可以省略掉一边。传统的感知机模型,选择的是省略掉分母,而后来的SVM模型选择的是省略掉的分子
因此最终感知机模型的损失函数简化为:
J = -\sum_{x_i \in M} y_i(w*x_i + b)这个损失函数就是感知学习机的经验风险函数。它是w,b的连续可导函数。显然它是非负函数。如果没有误分类点,则损失函数为0,而且误分类点越少,误分类点离超平面越近,损失函数越小。
3. 梯度下降求解
有了损失函数的定义,J = -\sum_{x_i \in M} y_i(w*x_i + b)
我们就很容易求得w,b变量各自的梯度
w的梯度是:\nabla_w J = -\sum_{x_i \in M} y_i*x_i
b的梯度是:\nabla_w J = -\sum_{x_i \in M} y_i
计算出梯度之后,随机梯度下降的过程就很简单了
- 选取初始值w0,b0
- 在训练集中选取数据x(i),y(i)
- 如果y(i)(w⋅x(i)+b)⩽0,则w←w+ηy(i)x(i),b←b+ηy(i)
- 转至步骤(2),直至训练集里面的每个点都不是误分类点,这个过程中训练集中的点可能会被重复的选中并计算。
4. 感知机的对偶模式
其实不知道为啥叫对偶模式。。看半天没搞清楚这个名字是怎么来的
感知机的对偶模式,其实是个非常简单的东西。你看前面梯度下降的时候,我们求偏导得到:
w的梯度是:\nabla_w J = -\sum_{x_i \in M} y_i*x_i
b的梯度是:\nabla_w J = -\sum_{x_i \in M} y_i
然后梯度下降的过程,就是这个不停的用这个偏导修正参数w,b。这个偏导不就是xy的内积么,那如果数据量比较小的时候,我们直接矩阵运算一把提前算好所有xy的内积,然后梯度下降的过程中直接查找表就可以了
完了