视频讲解地址
硬间隔SVM
https://www.bilibili.com/video/BV1Hs411w7ci?p=1
https://www.bilibili.com/video/BV1Hs411w7ci?p=2
https://www.bilibili.com/video/BV1Hs411w7ci?p=3
软间隔
https://www.bilibili.com/video/BV1Hs411w7ci?p=4
约束优化
https://www.bilibili.com/video/BV1Hs411w7ci?p=5
https://www.bilibili.com/video/BV1Hs411w7ci?p=6
https://www.bilibili.com/video/BV1Hs411w7ci?p=7
https://www.bilibili.com/video/BV1Hs411w7ci?p=8
核函数
https://www.bilibili.com/video/BV1UJ411U7Kc/
https://www.bilibili.com/video/BV1uE411V7h4/
SVM简介
SVM是一种二分类器。在样本线性可分的时候,在原空间寻找两类样本的最佳分类超平面;在样本线性不可分是,加入松弛变量并通过使用费线性应声将地位输入空间的样本映射到高维空间使其变为线性可分。
硬间隔SVM
引例
- 数据集: D a t a : { ( x i , y i ) ∣ i = 1 , 2 , . . . , N , x i ∈ R m × 1 , y i ∈ { − 1 , 1 } } Data: \{(\bold{x_i},y_i)| i=1,2,...,N,x_i\in R^{m\times 1},y_i\in\{-1,1\}\} Data:{(xi,yi)∣i=1,2,...,N,xi∈Rm×1,yi∈{−1,1}}
硬间隔SVM对应原空间线性可分的情况
现在要寻找对其线性可分的超平面,(在二维空间就是一条线)。
设这个平面为: w T x + b \bold{w}^T\bold{x} + b wTx+b,其中 x = ( x 1 , x 2 , . . . , x N ) T x = (x_1,x_2,...,x_N)^T x=(x1,x2,...,xN)T,那么判别模型可以为:
f ( w ) = s i g n ( w T x + b ) f(w) = sign(\bold{w}^T\bold{x} + b) f(w)=sign(wTx+b)
其中超平面可以是以下n多个。(P点是最点距离连线的中点)。
现在寻找局部最优的(硬间隔SVM的目标。这是一个很明显的最优规划问题。
注意是局部最优,不是全局最优。
直观上来看,什么情况下可以达到最优呢?
如上图所示,大致就是在P点的距离到其他两个切线的距离相等的时候,过p点的这个分类超平面我们认为其是最优的。
以上就是硬间隔SVM的思想。硬间隔SVM的目标就是根据距离找到局部最优的超平面。为什么不是全局最优呢? 因为换个斜率也是可能相切的,那个时候两个切线的中线又是另一个了。
理论推导
暂略,如果急需可看视频。
软间隔SVM
如上图,允许犯一点点错误
理论推导
暂略。如急需可以看视频。
核函数
往高维映射,便于线性分割。有人已经证明,当映射成无限维的时候,样本一定可以线性分割。
以上点在2维是无法线性分割的。那么到了高维呢?
假如原数据为:${x_i,y_i} _{i=1} ^N , 那 么 给 它 增 加 一 维 , 形 成 ,那么给它增加一维,形成 ,那么给它增加一维,形成{x_i,y_i,x_iy_i} _{i=1} ^N $,那么他们的在三维空间中的分布为:
这个时候,找到一个平面分割他们
核函数的作用是解决维度过高的时难以计算的问题。
代码实现
# %%
from sklearn import svm
import pandas as pd
import numpy as np
from sklearn import datasets
# %%
iris = datasets.load_iris()
X = iris.data
y = iris.target
names = iris.feature_names
# %%
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# %%
clf = svm.SVC(C=0.5, kernel='rbf')
clf.fit(X_train, y_train)
pred_y = clf.predict(X_test)
n_support_vector = clf.n_support_
sv_idx = clf.support_
Support_vector = clf.support_vectors_
# w = clf.coef_
# b = clf.intercept_
# %%
from sklearn.metrics import accuracy_score
print(accuracy_score(pred_y, y_test))
参数说明
-
C 对应软间隔分类器 C代表了松弛变量, C ∈ ( 0 , 1 ) C \in (0,1) C∈(0,1) C=1.0时相当于硬间隔分类器,C的值越大,代表对noisy的容忍程度越低。
-
kernel 核函数的选择,默认为’rbf’,即高斯核函数。exp(-gamma|u-v|^2)
其他可选项有:
‘linear’:线性核函数,u’*v
‘poly’:多项式核函数,(gamma*u’*v + coef0)^degree
‘sigmoid’:sigmoid核函数,tanh(gamma*u’*v + coef0)
3. degree:多项式核的阶数,默认为3,对其他核函数不起作用
4.gamma:核函数系数,只对’rbf’,‘poly’,'sigmoid’起作用
默认为’auto’,此时值为样本特征数的倒数,即1/n_features.
5.coef0:核函数的常数项,只对’poly’,'sigmoid’有用
6.shrinking:是否启用启发式收缩方式,默认为True
启发式收缩方式就是:如果能预知哪些变量对应着支持向量,则只要在这些样本上训练就够了,其他样本可不予考虑,这不影响训练结果,但降低了问题的规模并有助于迅速求解,起到一个加速训练的效果。
7.tol:停止训练的误差精度,默认值为0.001
8.probability:默认为False,决定最后是否按概率输出每种可能的概率,但需注意最后的预测函数应改为clf.predict_proba。