支持向量机(support vector machines,SVM)是一种二类分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;支持向量机还包括核技巧,这使它成为实质上的非线性分类器。支持向量机的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。支持向量机的学习算法是求解凸二次规划的最优化算法。
关于支持向量机一个通俗易懂的例子:Support Vector Machines explained well
对应的中文翻译:支持向量机(SVM)是什么意思?
对应的视频解释:https://www.youtube.com/watch?v=3liCbRZPrZA
看完上面的例子,应该对SVM有了一个基本的了解。
在样本空间中,划分超平面可通过如下线性方程来描述:
样本空间中任意点x到超平面(w, b)的距离可写为:
假设超平面(w, b)能将训练样本正确分类,即对于 (xi,yi)∈D ( x i , y i ) ∈ D ,若 yi=+1 y i = + 1 , 则有 wTxi+b>0 w T x i + b > 0 ;若 yi=−1 y i = − 1 , 则有 wTxi+b<0 w T x i + b < 0 . 令
如下图所示,距离超平面最近的几个训练样本使上式的等号成立,他们被称为“支持向量”(support vector),两个异类支持向量到超平面的距离之和为
它被称为“间隔”(margin).
欲找到具有“最大间隔”(maximum margin)的划分超平面,也就是要找到满足上式中约束的参数w和b,使得
γ
γ
最大,即
显然,为了最大化间隔,仅需要最大化 ||w||−1 | | w | | − 1 ,于是,式(5)可重写为
在这就是支持向量机的基本型。
对偶问题
式(6)是一个凸二次规划问题,能直接用现成的优化包求解,但我们可以有更高效的办法。对上式使用拉格朗日乘子法可得其“对偶问题”(dural problem)。
其中 α=(α1;α2;⋯;αm) α = ( α 1 ; α 2 ; ⋯ ; α m ) 。令 L(w,b,α) L ( w , b , α ) 对 w w 和b的偏导为零可得
将式(8)代入式(7), 就得到式(6)的对偶问题
软间隔
在前面的讨论中, 我们一直假定训练样本在样本空间是线性可分的,即存在一个超平面能将不同类的样本完全分开。当线性不可分时,可以引入“软间隔”(soft magin)的概念。
前面介绍的支持向量机要求所有的样本均满足约束(3),这称为硬间隔,而软间隔则是允许某些样本不满足约束。当然,在最大化间隔的同时,不满足约束的样本应尽可能少。
sklearn实现
线性可分时:
import numpy as np
X = np.array([[-2, -1], [-1, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
from sklearn.svm import SVC
clf = SVC()
clf.fit(X, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=’ovr’, degree=3, gamma=’auto’, kernel=’rbf’,
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
上面是分类器的默认参数
预测点(-0.8, -1)
print(clf.predict([[-0.8, -1]]))
得到:[1]
可视化决策边界:
import matplotlib.pyplot as plt
h = .02
x_min, x_max = -5.5, 5.5
y_min, y_max = -5.5, 5.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
color_map = {1: (1, 0, 0), 2: (0, 0, 1)}
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
# Plot also the training points
colors = [color_map[y1] for y1 in y]
plt.scatter(X[:, 0], X[:, 1], c=colors, edgecolors='black')
plt.title('SVC with rbf kernel')
plt.show()
由上面分类其的默认参数 kernel=’rbf’ 可知,核函数是径向基函数,可以分类非线性可分的数据。
我们将数据变为线性不可分,只需要将y变为[1, 2, 1, 2]即可,其他代码不变,获取的分类器如下图所示:
参考:机器学习, 周志华 著
sklearn.svm.SVC