Bootstrap

Python机器学习:支持向量机

这是我读本科的时候第一个接触到的机器学习算法,但也是第一个听完就忘的。。。

他的基本思想很简单:想办法把一个样本集划成两个部分:对于空间中的样本点集合,我们找到一个超平面把这个样本点集合给分成两个部分,其中一部分是正类,另一部分是反(负)类,支持向量机的优化目标就是找到一个超平面,使得空间中距离超平面最近的点到超平面的几何间距尽可能大,这些点就被称为支持向量。

首先得了解几个概念:

一、最大间隔和超平面:

和之前的一样,我们给定一个样本集合D=\left\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\right\}然后设定:y_i\in \left\{-1,+1\right\},设输入空间中的一个超平面为:

\omega^T x+b=0

其中,\omega是超平面的法向量,b为偏置,决定超平面的位置,根据点到直线的距离公式的扩展,空间中一点x_i到超平面\omega^T x+b=0的欧氏距离为:

r_i=\frac{|\omega^Tx+b|}{||\omega||}

 如果超平面可以把所有样本点分成两类,那实际上, 点x_i到超平面\omega^T x+b=0的欧氏距离就是一个分段函数:

\left\{\begin{matrix} r_i=\frac{|\omega^T+b|}{||\omega||}y_i=+1 & \\ r_i=-\frac{|\omega^T+b|}{||\omega||}y_i=-1 & \end{matrix}\right.

 好了,基本上把最大间隔和超平面给了解清楚了,说白了,就是,emm,我画个图来展示一下:

图1:简单示例

 

 其实这个就是个很简单的东西,第四张可看可不看,主要是前三张图片,第一张是y1=sin(x)

第二张是y2=cos(x*pi/2),第三张是y3=y1+y2,那也就是说,怎么样才能从第三张图中把y1和y2给分离出来呢,学信号的同学这不就来精神了吗,那不就是,对吧,我直接一个傅里叶变换从时空域变到频率域,这不就很简单的能分开了嘛,so easy对吧,可是,这里,咱说的是支持向量机,也就是说,我们得用支持向量机的观点来给他把(x,y1)和(x,y2)这两个信号分开,怎么分开,我暂时就想了上面提到的变换到频率域去解决,当然,学信号的人会想到用滤波器或者其他方法,总之,有很多,但是具体怎么做呢,大家可以自己去试试,找找文献或者技术资料,来看看信号的分离或者是信号去噪这方面的,我只知道,方法很多。

二、线性可分支持向量机

QAQ,这个概念就要两页多,因为小学抄古诗抄怕了,我是真不喜欢抄书,,但是,抄吧,首先看一下他的目标是啥:通过求解\omega和b,找到一个超平面,在保证这个超平面能偶正确将样本进行分类的同时,要使距离超平面最近的点到超平面的距离尽可能的大,说白了就是一个带约束条件的优化问题,其约束条件就是超平面可以把样本集合的点都给正确分类喽。

我们把距离超平面最近的点和超平面之间的距离记为r=min{ r_i} ,i=1,2,\cdots,m

最优化问题就是:

max \left\{ r\right\}

s.t, r_i=\frac{\omega^T+b}{||\omega||}y_i\geqslant r ,i=1,2,\cdots,m

我们可以对任一支持向量x^*通过对超平面公式进行缩放,使得

(\omega ^T x^*+b)y^*=1

然后x^*到超平面的距离就是\frac{1}{||\omega||},优化问题就能够写成

max \left\{ \frac{1}{||\omega||}\right\}

s.t, r_i=\frac{\omega^T+b}{||\omega||}y_i\geqslant \frac{1}{||\omega||} ,i=1,2,\cdots,m

最大化\frac{1}{||\omega||},也就是最小化\frac{1}{2}||\omega||^2,这里我用后者作为优化目标,就让你的计算可以方便了很多。 

数学上是完全可以证明,支持向量机的超平面存在着唯一性,至少有两个支持向量,而且超平面的位置仅由这些支持向量决定。

再感知机的模型中,优化的目标很明确:

在满足模型能够正确分类的约束条件下,使得样本集合中所有点到分割超平面的距离最小,这样的超平面可能会有无数个。

然后,怎么求上面给出的最优化问题嘞?可以用拉格朗日乘子法来求解:

Lag(\omega,b,\alpha)=\frac{1}{2}\left | \left | \omega \right | \right |^2+\sum_{i=1}^m\alpha_i(1-(\omega^T x_i+b)y_i),\alpha=(\alpha_1,\alpha_2,\cdots,\alpha_m)

\alpha_i\geqslant 0表示拉格朗日乘子,让lag函数对omega和b求偏导为零,然后计算就可以啦,详细的我就不写了,大家可以自己推一推,我也在纸上推一推,就不写latex了,嘿嘿。

;