SVM

2018-09-08  本文已影响0人  习惯了千姿百态

原文:http://blog.pluskid.org/?p=682
f(x)=w^Tx + b
f(x)=0的时候,这就是分割两个不同类别的超平面方程。当f(x)>0,我们把它归为一类,其对应的y=1;当f(x)<0时,归为另一类,其对应的y=-1。所以新来一个样本,我们只要计算f(x)的值,就可以将其归类。因为超平面会随着数据集的增长,会发生一些变化的,所以那些比较靠近超平面的点比较容易分错类。SVM就是用来找到一个超平面,使得那些最容易分错的点具有最大的可能性不被分错。

函数间隔functional margin:
\hat{\gamma}=y(w^Tx+b)=yf(x)
显然:
\hat{\gamma}=\min_{i=1,...,m} \hat{\gamma}^{(i)}
几何间隔geometrical margin:点到超平面的距离

几何间隔示意图

x=x_0+\gamma\frac{w}{||w||}
x_0是超平面上的点,满足f(x_0)=0,带入超平面方程:
\gamma=\frac{w^Tx+b}{||w||}=\frac{f(x)}{||w||}
这里的\gamma带符号,所以定义几何间隔为:
\widetilde{\gamma}=y\gamma=\frac{\hat{\gamma}}{||w||}
分类的目标函数定义为:
\max \widetilde{\gamma}
为了推导的方便,固定\hat{\gamma}=1,所以得到新的目标函数:
\max \frac{1}{||w||} \Leftrightarrow \min\frac{1}{2}||w||^2 \\ s.t.y_i(w^Tx_i+b)\ge1
这是一个二次优化问题。


利用拉格朗日乘子来计算:
L(w,b,\alpha)=\frac{1}{2}||w||^2-\sum_{i=1}^n\alpha_i(y_i(w^Tx_i+b)-1)
然后令
\theta(w)=\max_{\alpha_i\ge0}L(w,b,\alpha)

\theta(w) = \left\{ \begin{array}{} \frac{1}{2}||w||^2 & \textrm{if 满足约束条件}\\ \infty& \textrm{else} & \end{array} \right.
所以我们只要求\theta(w)的最小值即可:
p^*=\min_{w,b}\theta(w)=\min_{w,b}\max_{\alpha_i\ge0}L(w,b,\alpha)
p^*表示这个问题的最优值
根据拉格朗日对偶,kkt(省略10000字...):
d^*=\max_{\alpha_i\ge0}\min_{w,b} L(w,b,\alpha)
现在我们只要求解第二个问题即可:
首先求\min_{w,b} L(w,b,\alpha)这部分,让L分别关于w和b最小化:
\begin{align} \frac{\partial {L}}{\partial w}=0 &\Rightarrow w=\sum_{i=1}^n \alpha_i y_i x_i \\ \frac{\partial {L}}{\partial b} = 0 &\Rightarrow \sum_{i=1}^n \alpha_i y_i = 0 \end{align}
带回L得到:
\begin{align} {L}(w,b,\alpha) &= \frac{1}{2}\sum_{i,j=1}^n\alpha_i\alpha_jy_iy_jx_i^Tx_j-\sum_{i,j=1}^n\alpha_i\alpha_jy_iy_jx_i^Tx_j – b\sum_{i=1}^n\alpha_iy_i + \sum_{i=1}^n\alpha_i \\ &= \sum_{i=1}^n\alpha_i – \frac{1}{2}\sum_{i,j=1}^n\alpha_i\alpha_jy_iy_jx_i^Tx_j \end{align}
所以对偶问题就变成了:
\begin{align} \max_\alpha &\sum_{i=1}^n\alpha_i – \frac{1}{2}\sum_{i,j=1}^n\alpha_i\alpha_jy_iy_jx_i^Tx_j \\ s.t., &\alpha_i\geq 0, i=1,\ldots,n \\ &\sum_{i=1}^n\alpha_iy_i = 0 \end{align}
由于之前推导得到w=\sum_{i=1}^n\alpha_iy_ix_i,所以我们可以得到:
\begin{align} f(x)&=\left(\sum_{i=1}^n\alpha_i y_i x_i\right)^Tx+b \\ &= \sum_{i=1}^n\alpha_i y_i \langle x_i, x\rangle + b \end{align}
(<,>表示内积)
所有非 Supporting Vector 所对应的系数 α 都是等于零的,因此对于新点的内积计算实际上只要针对少量的“支持向量”而不是所有的训练数据即可。
(如果 x_i 是支持向量的话,上式中红颜色的部分是等于 0 的(因为支持向量的 functional margin 等于 1 ),而对于非支持向量来说,functional margin 会大于 1 ,因此红颜色部分是大于零的,而 α_i 又是非负的,为了满足最大化,αi 必须等于 0 。)


使用Kernel处理非线性问题:


比如这个数据集中,就无法使用线性方法来进行分类。
我们知道一条二次曲线的方程可以写成以下的形式:
a_1X_1 + a_2X_1^2 + a_3 X_2 + a_4 X_2^2 + a_5 X_1X_2 + a_6 = 0
如果我们构造另外一个五维的空间,其中五个坐标的值分别为 Z_1 = X_1\\Z_2=X_1^2\\Z_3=X_2\\Z_4=X_2^2\\Z_5=X_1X_2
那么在新的坐标系下可以写作:
\sum_{i=1}^5a_iZ_i + a_6 = 0
这就是我们熟悉的关于Z的超平面方程。

之前推导的分类函数:
f(x) = \sum_{i=1}^n\alpha_i y_i \langle x_i, x\rangle + b
使用Kernel后的函数:
f(x) = \sum_{i=1}^n\alpha_i y_i \langle \phi(x_i), \phi(x)\rangle + b
\phi(X)表示X映射后的向量)
我们把两个向量在映射后得出的向量的内积称为核函数
所以,现在我们的分类函数为:
\sum_{i=1}^n\alpha_i y_i \color{red}{\kappa(x_i,x)} + b
其中\alpha这样计算:
\begin{align} \max_\alpha &\sum_{i=1}^n\alpha_i – \frac{1}{2}\sum_{i,j=1}^n\alpha_i\alpha_jy_iy_j \color{red}{\kappa(x_i, x_j)} \\ s.t., &\alpha_i\geq 0, i=1,\ldots,n \\ &\sum_{i=1}^n\alpha_iy_i = 0 \end{align}
核函数分类:


上一篇 下一篇

猜你喜欢

热点阅读