机器学习系列(三十三)——非线性可分问题与SVM核函数

本篇主要内容:SVM解决非线性可分,Kernel Function

添加多项式特征解决非线性可分问题

上篇我们介绍了SVM是如何生成线性决策边界解决线性可分或近似线性可分问题的,本篇将介绍SVM如何解决线性不可分问题。来看这样的一个数据集:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
X, y = datasets.make_moons(noise=0.15,random_state=666)
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()
moon

这是sklearn的datasets中的moon数据,这里给它加入了一定的噪音,显然这是一个线性不可分数据。在Logostic回归中,为了得到非线性决策边界,我们为数据加入了多项式特征,同样的思想,我们也可以在使用SVM时加入多项式特征,这样就可以解决一些非线性可分问题。针对上面的例子:

from sklearn.preprocessing import PolynomialFeatures,StandardScaler
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
def PolynomialSVC(degree,C=1.0):
    return Pipeline([
        ('poly',PolynomialFeatures(degree=degree)),
        ('std_scaler',StandardScaler()),
        ('linearSVC',LinearSVC(C=C))
    ])
poly_svc = PolynomialSVC(degree=3)
poly_svc.fit(X,y)

这里将所有过程封装了一个Pipeline。使用它创建一个SVM分类器,给数据添加3次幂多项式特征,训练该分类器,并绘制决策边界:

plot_decision_boundary(poly_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()
决策边界

可以看到决策边界已经是非线性的了,并且对于图中的两类样本也很好地进行了分类。


核函数(Kernel Function)

SVM本质上就是求解一个二次规划问题,不过一般我们并不直接求解:min\frac{1}{2} ||W||^2+C\sum_{i=1}^{m}\eta_i\\s.t.y^{(i)}(W^Tx^{(i)}+b)\geq1

而是求解它的对偶问题(具体求解翻阅机器学习或运筹学教材),在它的对偶问题中,会遇到不同特征向量的内积:

对偶问题

如果要解决线性不可分问题,还需要SVM通过一个非线性变换 φ( x) ,将输入的低维特征映射到高维特征空间,特征空间的维数可能非常高。考虑到真正求解SVM的最优化问题的时候,往往只会用到两个高维特征空间特征的内积,如果SVM的求解只用到内积运算,而在低维输入空间又存在某个函数 K(x, x′) ,它恰好等于在高维空间中这个内积,即K( x, x′) =<φ( x)⋅φ( x′) > 。那么SVM就不用计算复杂的非线性变换,而由这个函数 K(x, x′) 直接得到非线性变换的内积,大大简化了计算。这样的函数 K(x, x′) 就被称为核函数
以一个例子来展示一下核函数的效果,假设现在有两个二维空间中的数据点x=(x1,x2)和y=(y1,y2),考虑下面这个二元函数:
K(x,y)=(x.y+1)^2

于是,K(x,y)=(x_1y_1+x_2y_2+1)^2\\=x_1^2y_1^2+x_2^2y_2^2+2x_1y_1+2x_2y_2+2x_1x_2y_1y_2\\=(x_1^2,x_2^2,\sqrt{2}x_1x_2,\sqrt{2}x_1,\sqrt{2}x_2,1).(y_1^2,y_2^2,\sqrt{2}y_1y_2,\sqrt{2}y_1,\sqrt{2}y_2,1)\\=p.q

发现最后结果恰好是两个向量的内积,而且两个向量分别是二维空间数据点x和y在5维空间中的映射!想到刚才核函数的定义,我们很容易知道,K(x,y)就是一个核函数。它给出了一个二维的表达式,使得x,y代入即可求值,而不再需要先把x,y映射成5维空间中的向量p,q再求内积,这样大大简化了运算。

sklearn中常用的核函数:

常用核函数

通过在SVM中使用这些核函数可以将原本线性不可分的数据映射到高维特征空间后变的线性可分。


sklearn中的RBF核

RBF(Radial Basis Function)中文叫径向基函数,其实就是Gauss核函数:
K(x^{(i)},x^{(j)})=exp(-\gamma||x^{(i)}-x^{(j)}||^{2})

它可以将特征映射到无穷维空间,其中的\gamma是一个超参数,\gamma越大表示模型复杂度越高,相应的也就越容易出现过拟合,实际中要通过调参得到最好的\gamma。下面在moon数据集上使用Gauss核函数:

from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline

def RBFKernelSVC(gamma=1.0):
    return Pipeline([
        ('std_scaler',StandardScaler()),
        ('svc',SVC(kernel='rbf',gamma=gamma))
    ])

接下来训练一个使用RBF核的SVM,此时\gamma默认是1,并绘制决策边界:

svc = RBFKernelSVC(gamma=1.0)
svc.fit(x,y)
plot_decision_boundary(svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()

决策边界:

gamma=1

可以看到\gamma=1时模型的效果还是不错的。
再来看一下\gamma=100的情况:

svc100 = RBFKernelSVC(gamma=100)#过拟合
svc100.fit(x,y)
plot_decision_boundary(svc100,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()

决策边界:

gamma=100

此时明显出现了过拟合。
可以继续测试,当\gamma=0.1时会出现欠拟合,这里不再展示。

在sklearn中可以很方便地调用它提供的核函数,当然也可以自己编写核函数,在符合sklearn接口的情况下以下能够无缝衔接。

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

推荐阅读更多精彩内容