机器学习:支持向量机

本文来自同步博客

P.S. 不知道简书怎么显示数学公式以及更好的排版内容。所以如果觉得文章下面格式乱的话请自行跳转到上述链接。后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱。看原博客地址会有更好的体验。

上一篇文章使用KNN算法解决机器学习的分类问题。本文将介绍另一种号称解决分类问题的最佳算法,叫支持向量机SVM(Support Vector Machine)。

这篇文章将不立即从代码开始介绍SVM,而是从理论知识开始了解其原理,最后用代码实践并验证我们对知识的理解。

基本原理

SVM的目标是找到一个超平面,使得超平面到最近样本点之间的间隙最大化,从而把样本点切割成不同的子空间以得到分类的效果。

切割方法的比较

看上面图片所列举的三种针对同一空间中样本数据的切割方法。最后一种才是符合SVM要求的切割方法。

需要加深一下大家的印象:

  1. 在一维空间中,这个超平面是一个点;
  2. 在二维空间中,这个超平面是一条线;
  3. 在三维空间中,这个超平面是一个面;
  4. 更多维的空间,呵呵,我想象不了...

如果仅仅依靠点线面只能处理具有线性可分割特征的数据,而当样本数据无法进行线性切割时,是不是SVM就不适用了呢?不是的,对这种场景,可以通过一些转换函数,把直线或者平面变成曲线或者曲面进行切割。

本文还是我们先从可以线性切割的简单的场景出发进行推导SVM的基本原理。有关无法进行线性切割的内容,我们将在后面介绍。

数学推导

为了找到符合SVM要求的超平面,我们需要先通过数学语言描述它。请看下图:

超平面的数学表示

在这个空间中有四个样本点分成了两类,红色的表示“+”类,黄色表示“-”类。图中的实线L就是我们在这个空间中根据SVM定义找到的超平面。样本点A、B、C、D等在空间中均用向量表示,特别地,落在虚线上的点A、B、C作为间隙的边界点而存在,将会为计算超平面作出贡献,因此成为Support Vector。这应该就是Support Vector Machine名字的由来。

现在我们定义一个向量-\vec{w}-,它垂直于超平面L,是L的法向量。则使用法向量-\vec{w}-描述超平面L为:

\vec{w}^{T}(\vec{x} - \vec{x\_0}) = 0

其中-\vec{x\_0}--\vec{w}-与超平面的交点。令-b = -\vec{w}\vec{x\_0}-,L可以表示为:

式子1: \vec{w}^{T}\vec{x} + b = 0

针对一个新的数据点-\vec{u}-,如果点落在超平面L的右上方,则判定这个数据点为“+”类;若是落在L的左下方则判定为“-”类。即决策规则为:

Rule: \begin{cases} \vec{w}^{T}\vec{u} + b > 0, & \mbox{if }\vec{u}\mbox{ is class '+'} \\\\ \vec{w}^{T}\vec{u} + b < 0, & \mbox{if }\vec{u}\mbox{ is class '-'} \end{cases}

我们的目标是确定超平面L。但是由于-\vec{w}-的长度是不清楚的,-b-也受之影响而无法确定。它们可以有太多太多中组合了。所以接下来需要通过样本数据来约束-\vec{w}--b-的取值范围,为我们求解提供依据。

原本对于对所有样本点-x\_i-,满足:

\begin{array}{lcl} \vec{w}^{T}\vec{x\_i} + b > 0,& \mbox{if }\vec{x\_i}\mbox{ is class '+'} \\\\ \vec{w}^{T}\vec{x\_i} + b < 0,& \mbox{if }\vec{x\_i}\mbox{ is class '-'} \end{array}

为了增加约束条件从而限制-\vec{w}-的取值范围,我们把超平面分别向右上和左下平移,直至到达虚线位置。并且限定右上虚线和左下虚线的表达式为:-\vec{w}^{T}\vec{x\_i} + b = 1--\vec{w}^{T}\vec{x\_i} + b = -1-。能够同时满足超平面以及两个虚线位置的超平面表达式的-\vec{w}--b-组合一定是存在的。那么所有的样本点-x\_i-都将满足下面不等式:

式子2: \begin{cases} \vec{w}^{T}\vec{x\_i} + b \ge 1,& \mbox{if }\vec{x\_i}\mbox{ is class '+'} \\\\ \vec{w}^{T}\vec{x\_i} + b \leq -1,& \mbox{if }\vec{x\_i}\mbox{ is class '-'} \end{cases}

这个不等式组利用了样本点已经确定了所属类这个已知条件来约束-\vec{w}-的取值范围。选择“1”和“-1”则是一个数学技巧,让后续计算中更加方便,它并不影响计算过程。

接下来,引入分类变量-y\_i-
式子3: \begin{cases} y\_i = 1,& \mbox{if }\vec{x\_i}\mbox{ is class '+'} \\\\ y\_i = -1,& \mbox{if }\vec{x\_i}\mbox{ is class '-'} \end{cases}

式子2和式子3两个方程组分别相乘,并把右边的1移到左边,可以得到一个统一的不等式:

式子4:y\_i(\vec{w}^{T}\vec{x\_i} + b) - 1 \ge 0

这个不等式只有落在SVM分割间隙的边缘(即图中虚线)的样本点(如:A、B、C)才能使等号成立。

到这里,请重新回到SVM的原理:寻找让间隙最大化的超平面作为分类的决策边界。我们需要确定分割间隙的宽度的计算函数。假设在间隙两个边缘(两条虚线)处分别取样本-\vec{x\_+}--\vec{x\_-}-,对应类型取值为-y\_+ = 1--y\_- = -1-,可以得到:
\begin{align} width &= \frac{\vec{w}^{T}}{|\vec{w}|}(\vec{x\_+} - \vec{x\_-}) \\\\ &= \frac{1}{|\vec{w}|}(\vec{w}^{T}\vec{x\_+} - \vec{w}^{T}\vec{x\_-}) \\\\ &= \frac{1}{|\vec{w}|}(\frac{1-b}{y\_+} - \frac{1-b}{y\_-})\\\\ &= \frac{1}{|\vec{w}|}(\frac{1-b}{1} - \frac{1-b}{-1})\\\\ &= \frac{2}{|\vec{w}|} \end{align}

为了让间隙的宽度取得最大,可以推导出:

式子5:\begin{align} & Maximize(width) \\\\ &\Leftrightarrow Maximize(\frac{2}{|\vec{w}|}) \\\\ &\Leftrightarrow Minimize(|\vec{w}|)\\\\ &\Leftrightarrow Minimize(\frac{1}{2}|\vec{w}|^2)\\\\ &\Leftrightarrow Minimize(\frac{1}{2}\vec{w}^{T}\vec{w}) \end{align}

有了这个依据,利用拉格朗日乘子法求不等式约束条件下的极值问题,可以构造这样的函数:

L(\vec{w}, b, \vec{\alpha}) = \frac{1}{2}\vec{w}^{T}\vec{w} - \sum\_{i}^{n}{\alpha\_i[y\_i(\vec{w}^{T}\vec{x\_i})-1]}, \alpha\_i \ge 0, i = 1,2...n

在这里问题的目标是求让-L(\vec{w}, b, \vec{\alpha})-最小时的-\vec{w}--b--\vec{\alpha}-,因此先分别对-\vec{w}--b-求偏导:

\frac{\partial L}{\partial \vec{w}} = \vec{w} - \sum\_{i}^{n}{\alpha\_i y\_i \vec{x\_i}}, \frac{\partial L}{\partial b} = - \sum\_{i}^{n}{\alpha\_i y\_i}

让偏导函数等于0,有:

\vec{w} = \sum\_{i}^{n}{\alpha\_i y\_i \vec{x\_i}}, \sum\_{i}^{n}{\alpha\_i y\_i} = 0

在这里先不求出关于-\vec{\alpha}-的偏导,而是把上述两个等式代回拉格朗日函数L,从而可以得到一个关于-\vec{\alpha}-的函数:

L(\vec{\alpha}) = \sum\_{i}^{n}{\alpha\_i} - \frac{1}{2}\sum\_{i}^{n}{\sum\_{j}^{n}{\alpha\_i \alpha\_j y\_i y\_j \vec{x\_i}^{T} \vec{x\_j}}}, \sum\_{i}^{n}{\alpha\_i y\_i} = 0, \alpha\_i,\alpha\_j \ge 0, i,j = 1,2...n

根据对偶问题的思想,上述最小化问题可转为求使-L(\vec{\alpha})-最大化的-\alpha-(参考KKT条件问题)。

对上式两边添加负号,进一步转换问题:求让- -L(\vec{\alpha})-最小化的-\alpha-。这时有:

$$
F(\vec{\alpha}) = -L(\vec{\alpha}) = \frac{1}{2}\vec{\alpha}_{T}\begin{bmatrix}
y_{1}y_{1}\vec{x_1}^{T}\vec{x_1} & y_{1}y_{2}\vec{x_1}^{T}\vec{x_2} & \cdots & y_{1}y_{n}\vec{x_1}^{T}\vec{x_n} \\
\vdots & \vdots & \ddots & \vdots \\
y_{n}y_{1}\vec{x_n}^{T}\vec{x_1} & y_{n}y_{2}\vec{x_n}^{T}\vec{x_2} & \cdots & y_{n}y_{n}\vec{x_n}^{T}\vec{x_n} \\
\end{bmatrix}\vec{\alpha}

  • \begin{bmatrix}
    -1 & -1 & \cdots & -1 \\
    \end{bmatrix} \vec{\alpha}, \vec{y}^{T}\vec{\alpha} = 0, \vec{\alpha} \ge 0
    $$

啊哈,这是二次规划的形式,可以利用二次规划求解。我们需要求解能够使-F(\alpha)-最小的-\alpha-值,然后通过-\alpha-才可以得到-\vec{w}--b-

这里提供一个使用scipy求解二次规划的代码示范:

import numpy as np
from scipy import optimize
# 形如:F = (1/2)*x.T*H*x + c*x + c0
# 约束条件:Ax <= b
# 现在假设已知参数如下:
H = np.array([[2., 0.],
              [0., 8.]])
c = np.array([0, -32])
c0 = 64
A = np.array([[ 1., 1.],
              [-1., 2.],
              [-1., 0.],
              [0., -1.],
              [0.,  1.]])
b = np.array([7., 4., 0., 0., 4.])

# 设置初始值
x0 = np.random.randn(2)

def loss(x, sign=1.):
    return sign * (0.5 * np.dot(x.T, np.dot(H, x))+ np.dot(c, x) + c0)

def jac(x, sign=1.):
    return sign * (np.dot(x.T, H) + c)

cons = {'type':'ineq',
        'fun':lambda x: b - np.dot(A,x),
        'jac':lambda x: -1 * A}
opt = {'disp':False}

res_cons = optimize.minimize(loss, x0, jac=jac,constraints=cons,
                                 method='SLSQP', options=opt)
print(res_cons)

源码见Github

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容