19

SVM原理详细图文教程来了!一行代码自动选择核函数,还有模型实用工具

 3 years ago
source link: https://www.qbitai.com/2020/07/16312.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

SVM?老分类算法了,轻松拿下,然而……

贾浩楠 发自 凹非寺

量子位 报道 | 公众号 QbitAI

SVM?老分类算法了,轻松拿下。

然而,每一次老板让你讲解SVM,或每一次面试被问到SVM,却总是结结巴巴漏洞百出。

「这些人怎么总能精准发现我的盲点?」

简直让人怀疑自己掌握的是假SVM。

如果你有这样的问题,那这篇 SVM数学原理 对你会有很大帮助,一起来看看吧。

SVM 由线性分类开始

理解SVM,咱们必须先弄清楚一个概念: 线性分类器

给定一些数据点,它们分别属于两个不同的类,现在要找到一个线性分类器把这些数据分成两类。

如果用x表示数据点,用y表示类别(y可以取1或者-1,分别代表两个不同的类),一个线性分类器的目标是要 在n维的数据空间中找到一个超平面 (hyper plane),将x的数据点分成两类,且超平面距离两边的数据的间隔最大。

NZRb6nf.gif

这个超平面的方程可以表示为( wT中的T代表转置):

Rf63AvI.jpg!web

Qny2Yva.jpg!web

△2维坐标系中,超平面是一条直线

当f(x)等于0的时候,x便是位于超平面上的点,而f(x)大于0的点对应 y=1 的数据点,f(x)小于0的点对应y=-1的点。

SVM 想要的就是找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。任意超平面可以用下面这个线性方程来描述:

bE7juai.jpg!web

二维空间点(x,y)到直线Ax+By+C=0的距离公式是:

bQraumJ.jpg!web

扩展到n维空间后,点x=(x1,x2……xn)到直线wTx+b=0的距离为:

yq2eEzJ.jpg!web

其中 :

ziUvInv.jpg!web

根据支持向量的定义,支持向量到超平面的距离为d,其他点到超平面的距离大于d。

于是有:

fEb6fqU.jpg!web

||w||d是正数,令它为 1(之所以令它等于 1,是为了方便推导和优化,且这样做对目标函数的优化没有影响),于是:

MNBBJnI.jpg!web

将两个方程合并,有:

QRZZry2.jpg!web

至此,就得到了最大间隔超平面的上下两个超平面。

JFjY3q2.jpg!web

每个支持向量到超平面的距离可以写为:

Nfa2yua.jpg!web

y(wTx+b)>1>0 可以得到  y(wTx+b)=|wTx+b| ,所以可以将支持向量到超平面距离改写为:

ArAzmyJ.jpg!web

最大化这个距离:

An6JnaN.jpg!web

这里乘上 2 倍是为了后面推导方便,对目标函数没有影响。

带入一个支持向量,可以得到:

MRBjmej.jpg!web

所以得到的最优化问题是:

7nqUVzj.jpg!web

处理异常值

有时,对于某些点(x(i),y(i)),分类器可能会做出错误操作。

尽管在开发实际使用的SVM模型时,会设计冗余,避免过拟合,但仍然需要想办法将误差控制在一个较小的范围。

可以通过在模型中增加 惩罚机制 (用c表示)解决这个问题。

MNVFNzz.jpg!web

I3i67bz.jpg!web

设SVM输出结果为E,则上图中出现的E=0则没有惩罚。

若果c非常大,则模型分类更加精准,但支持向量到超平面距离小,容易出现过拟合。

若c=1,则支持向量到超平面距离最大化,尽管会出现一些分类误差,但这是一种较好的方案。

约束凸优化问题

为了克服 约束凸优化问题 ,采用PEGASOS算法。

重新构造一个约束独立性方程:

vuIRRzV.jpg!web

上式表示,如果点远离直线,则误差将为零,否则误差将为(1-t(i))。

我们需要最小化的是:

ZvA3Y3q.jpg!web

由于消除了约束,因此可以采用梯度下降来最大程度地减少损失。

yIfmmin.jpg!web

梯度下降算法计算损失:

aU36byV.jpg!web

在SVM上应用梯度下降:

6RRRfm7.jpg!web

非线性分类

使用SVM对非线性数据进行分类,需要将数据投影到更高的维度,即通过 增加低维数据的特征向量将其转换为高维数据

uYfYzuM.jpg!web

增加数据特征向量需要消耗巨大的计算资源,这里采用核函数。

而这种思路最难的点,是为你自己的模型选择一个合适的核函数。

这里推荐一种自动调参方法 GridSearch

将多种核函数(线性、RBF、多项式、sigmoid等)等标号,依次调用,找到一个最合适自己模型的。

定义一个变量params:

params = [{‘kernel’:[‘linear’, ‘rbf’, ‘poly’, ‘sigmoid’], ‘c’:[0.1, 0.2, 0.5, 1.0, 2.0, 5.0]}

调用:

RZ3yuaB.jpg!web

以上详细介绍了SVM背后的数学原理,并提供了一些使用SVM模型时的问题解决办法。

其中,使用代码自动选择核函数的方法来自外国博主 Daksh Trehan

如果你对SVM的原理有更深刻的理解,或有其他实用的技巧,请留言分享给大家吧。

参考链接

https://medium.com/@dakshtrehan?source=post_page—–d46e94b23b9d———————-

版权所有,未经授权不得以任何形式转载及使用,违者必究。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK