关灯

支持向量机(SVM)

[复制链接]
admin 发表于 2019-1-20 12:59:12 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 

关于SVM

可以做线性分类、非线性分类、线性回归等,相比逻辑回归、线性回归、决策树等模型(非神经网络)功效最好

1532505442090553404.jpg

 

传统线性分类:选出两堆数据的质心,并做中垂线(准确性低)——上图左

SVM:拟合的不是一条线,而是两条平行线,且这两条平行线宽度尽量大,主要关注距离车道近的边缘数据点(支撑向量support vector),即large margin classification——上图右

 

1532505435718643309.jpg

 

使用前,需要对数据集做一个scaling,以做出更好的决策边界(decision boundary)

1532505427728133006.jpg

 

但需要容忍一些点跨越分割界限,提高泛化性,即softmax classification

1532505417665759664.jpg

 

在sklearn中,有一个超参数c,控制模型复杂度,c越大,容忍度越小,c越小,容忍度越高。c添加一个新的正则量,可以控制SVM泛化能力,防止过拟合。(一般使用gradsearch)

SVM特有损失函数Hinge Loss

1532505410526693950.jpg

 

 

LinearSVC

(liblinear库,不支持kernel函数,但是相对简单,复杂度O(m*n))

同SVM特点吻合,仅考虑落在分类面附近和越过分类面到对方领域的向量,给于一个线性惩罚(l1),或者平方项(l2)

  1. import numpy as np
  2. from sklearn import datasets
  3. from sklearn.pipeline import Pipeline
  4. from sklearn.preprocessing import StandardScaler
  5. from sklearn.svm import LinearSVC
  6. iris = datasets.load_iris()
  7. X = iris["data"][:,(2,3)]
  8. y = (iris["target"]==2).astype(np.float64)
  9. svm_clf = Pipeline((
  10.    ("scaler",StandardScaler()),
  11.    ("Linear_svc",LinearSVC(C=1,loss="hinge")),
  12.    ))
  13. svm_clf.fit(X,y)
  14. print(svm_clf.predit([[5.5,1.7]]))
复制代码

 

对于nonlinear数据的分类

有两种方法,构造高维特征,构造相似度特征

 

使用高维空间特征(即kernel的思想),将数据平方、三次方。。映射到高维空间上

  1. from sklearn.preprocessing import PolynomialFeatures
  2. polynomial_svm_clf = Pipeline((
  3. ("poly_features", PolynomialFeatures(degree=3)),
  4. ("scaler", StandardScaler()),
  5. ("svm_clf", LinearSVC(C=10, loss="hinge"))
  6. ))
  7. polynomial_svm_clf.fit(X, y)
复制代码

 

这种kernel trick可以极大地简化模型,不需要显示的处理高维特征,可以计算出比较复杂的情况但模型复杂度越强,过拟合风险越大

  1. from sklearn.svm import SVC
  2. poly_kernel_svm_clf = Pipeline((
  3. ("scaler", StandardScaler()),
  4. ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
  5. ))
  6. poly_kernel_svm_clf.fit(X, y)
复制代码

SVC(基于libsvm库,支持kernel函数,但是相对复杂,不能用太大规模数据,复杂度O(m^2 *n)-O(m^3 *n))

 可以直接使用SVC(coef0:高次与低次权重)

 

 

1532505399996558281.jpg

 

 

添加相似度特征(similarity features)

例如,下图分别创造x1,x2两点的高斯分布,再创建新的坐标系统,计算高斯距离(Gaussian RBF Kernel径向基函数)

1532505389693623755.jpg

 

gamma(γ)控制高斯曲线形状胖瘦,数据点之间的距离发挥更强作用

  1. rbf_kernel_svm_clf = Pipeline((
  2.      ("scaler", StandardScaler()),
  3.      ("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
  4.   ))
  5. rbf_kernel_svm_clf.fit(X, y)
复制代码

1532505379976049497.jpg

如下是不同gamma和C的取值影响 

SGDClassifier(支持海量数据,时间复杂度O(m*n))

 

 

SVM Regression(SVM回归)

尽量让所用instance都fit到车道上,车道宽度使用超参数 1532505371478685006.jpg 控制,越大越宽

 

使用LinearSVR

  1. from sklearn.svm import LinearSVR
  2. svm_reg = LinearSVR(epsilon=1.5)
  3. svm_reg.fit(X, y)
复制代码

 

 使用SVR

  1. from sklearn.svm import SVR
  2. svm_poly_reg = SVR(kernel="poly", degree=2, C=100, epsilon=0.1)
  3. svm_poly_reg.fit(X, y)
复制代码

1532505362966860603.jpg

 

 

数学原理

1532505354681242870.jpg

 

 

w通过控制h倾斜的角度,控制车道的宽度,越小越宽,并且使得违反分类的数据点更少

 

 

hard margin linear SVM

优化目标:,并且保证 1532505338670446051.jpg

1532505331711507662.jpg

 

 

soft margin linear SVM

增加一个新的松弛变量(slack variable) 1532505324914415174.jpg ,起正则化作用

优化目标:,并且保证 1532505309842595608.jpg

放宽条件,即使有个别实例违反条件,也惩罚不大

 

LinearSVM

使用拉格朗日乘子法进行计算,α是松弛项后的结果

1532505300637926313.jpg

 

计算结果: 1532505294132492789.jpg 取平均值

1532505258115324993.jpg

 

 

KernelizedSVM

由于 1532505283261387714.jpg

 

故可先在低位空间里做点积计算,再映射到高维空间中。

下列公式表示,在高维空间计算可用kernel trick方式,直接在低维上面计算

1532505242120909264.jpg

1532505234378674401.jpg

 

几个常见的kernal及其function

1532505227894452305.jpg

回复

使用道具 举报

 
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


1关注

0粉丝

1603帖子

排行榜

关注我们:微信订阅号

官方微信

APP下载

全国服务热线:

4000-018-018

公司地址:上海市嘉定区银翔路655号B区1068室

运营中心:成都市锦江区东华正街42号广电仕百达国际大厦25楼

邮编:610066 Email:3318850993#qq.com

Copyright   ©2015-2016  比特趋势Powered by©Discuz!技术支持:迪恩网络