支持向量机是一种二分类模型,它是通过在特征空间中建立间隔最大的分类器,这与感知机模型不同。
对二分类的逻辑回归,假设特征数为2,那么训练模型的过程通过梯度下降不断更新参数逼近全局最优解,拟合出一条直线作为决策边界,使得这个决策边界划分出来的分类结果误差最低。
当特征数量超过2时,这时用来分割不同类别的“线”就成为一个面,简称超平面(hyperplane),“超”即是多维的意思(二维就是一条线,三维就是一个面,多维就是超平面)。划分超平面可用如下线性方程表示:
w T x + b =0
其中, w =( w 1 , w 2 ,…, w d ) T 为法向量, b 为位移。
如果要用一条直线将图3-7的两种类别(“+”和“-”)分开,可看到可分离的直线有多条。
直观上应该选红色线,因为它是“最能”分开这两种类别的。如果选择黑色线,那么可能存在一些点刚好越过黑色的线,导致被错误分类,但是红色线的容错率会更好,也就不容易出错。
如图3-8这种情况,如果选择绿色线,新来一个需要预测的样本(蓝色的点)本来属于“+”,但是却被分到“-”这一类,但是红色线就不会,即红色线所产生的分类结果是最健壮的,对未见示例的泛化能力最强。
红色线的这条决策边界就是通过间隔最大化求得的,并且是唯一的。在了解间隔最大化之前先了解一下函数间隔和几何间隔的概念。
图3-7 两种类别分离效果
图3-8 分类效果
一般来说,一个点距离超平面的远近可以表示分类预测的确信程度。
(1)函数间隔:对于给定训练集和超平面( w , b ),定义超平面( w , b )关于样本点( x i , y i )的函数间隔为
定义超平面( w , b )关于训练集的函数间隔为超平面关于训练集中所有样本点的函数间隔的最小值:
可以看到,当 w 、 b 成比例变化时,超平面没有改变但是函数间隔变了,因此可以对 w 、 b 做相应的约束,就得到了几何间隔。
(2)几何间隔:对于给定训练集和超平面( w , b ),定义超平面( w , b )关于样本点( x i , y i )的集合间隔为
定义超平面( w , b )关于训练集的函数间隔为超平面关于训练集中所有样本点的几何间隔的最小值:
这里的几何间隔就是点到平面的距离公式,因为
y
为1或-1,且当前数据集线性可分,所以和
是等价的。
当 w 、 b 成比例变化时,函数间隔也会成比例变化,而几何间隔是不变的,所以要考虑几何间隔最大化,即求解间隔最大化的超平面的问题就变成了求解如下带约束的优化问题:
上面的约束条件表示对于训练集中所有样本关于超平面的几何距离都至少是
r
。又因为函数间隔和几何间隔之间存在这样的关系:
,所以上面的优化问题可以写成如下形式:
又因为
w
、
b
成比例变为
λ
w
、
λ b
,函数间隔变为
,虽然改变了函数间隔但是不等式约束依然满足,并且超平面也没有变,所以
的取值并不影响目标函数的优化。为了方便计算,可以令
,并且由于最大化
和最小化
是等价的,所以优化问题可以写成如下形式:
使得上面等式成立的点也被称为支持向量(support vector)。
【例3-2】 训练SVM模型。
import numpy as np from sklearn import svm from sklearn.svm import SVC import matplotlib.pyplot as plt clf=svm.SVC() #支持向量机的最大边界分类 def SVM(): svm = SVC(kernel='linear',C=1.0,random_state=0) svm.fit(X_train_std,y_train) plot_decision_regions(X_combined_std,y_combined, classifier=svm,test_idx=range(105,150)) plt.xlabel('花瓣长度(标准化)') plt.ylabel('花瓣宽度(标准化)') plt.legend(loc='upper left') plt.tight_layout() plt.show() SVM()
运行程序,效果如图3-9所示。
图3-9 SVC实现分类