0
点赞
收藏
分享

微信扫一扫

机器学习-支持向量机SVM

文章目录


SVM 是一个非常优雅的算法,具有完善的数学理论,虽然如今工业界用到的不多,但还是决定花点时间去写篇文章整理一下。

一支持向量

1.0简介

支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。

1.1算法思想

下面通过一个列子理解:
一个勇者为了救公主遇到了魔王boss,魔王给他设置了一个考验如果能勇者能通过考验就把公主还给他,桌面上摆放了一些红球和篮球,要求勇者用一根棍分开它们,要求:尽量在放更多球之后,仍然适用。
经过不断调整位置是木棍与两侧的球尽可能保持最大的距离就可以解决这个问题。
在这里插入图片描述
然后大魔王又升级了这个挑战,他将两种球混乱摆放使得无法使用一根直木棍来分开这两种球
在这里插入图片描述
这当然难不倒我们的勇者,勇者用力一拍桌子把球都拍到空中然后在空中迅速的抓起一张纸塞了进去将两种颜色的球分开了
在这里插入图片描述
魔王大吃一惊,我类个去居然还有这种操作,在下服了,只能把公主还给了勇者

最后无聊的人们把这些球叫做(数据)data,把棍子叫(分类器)classifier, 找到最大间隙的trick叫做(优化)optimization,拍桌子叫做(核变换)kernelling, 那张纸叫做(超平面)hyperplane。

经过以上例子我们可就能理解svm的作用了,如果数据是线性可分的,我们就只用一条直线就可以将他们分开,这个时候只需要将边上的球到直线的间隔最大化就好了,这就是优化过程。
当我们遇到线性不可分的问题的时候,就用使用一种拍桌子的trick,也就是对应我们的核变换(kernel),然后在高维空间使用超平面将数据分类。

在这里插入图片描述
决策边界:就是图中间的那条线,用来判断分类
支持向量:就是指图中左右两边最接近决策边界的数据
最大间隔:选择离决策边界最远的支持向量,也就是我们要寻找的最优解

首先考虑二维空间下,决策方程定义为 y=wx+b 对应 R n R^n Rn
中的一个超平面 S 其中 w 是超平面的法向量 ,b 截距
在这里插入图片描述
根据点到面距离求法我们能得到 d i s t a n c e = 1 ∣ ∣ w ∣ ∣ ∣ w x i + b ∣ distance=\frac{1}{||w||}|wx_i+b| distance=w1wxi+b

在这里插入图片描述
在推导之前,先给出一些定义。假设给定一个特征空间上的训练数据集

在这里插入图片描述
其中
[公式]在这里插入图片描述
x i x_i xi,为第 i个特征向量, y i y_i yi为类标记,当它等于+1时为正例;为-1时为负例。再假设训练数据集是线性可分的。

几何间隔:对于给定的数据集T 和超平面 w ∗ x + b w*x+b wx+b ,定义超平面关于样本点 ( x i , y i ) (x_i,y_i) (xi,yi) 的几何间隔为
在这里插入图片描述
因为我们要最大间隔,所以优化目标为
找到一条线(w和b),使得离该线最近的点能够最远
a r g m a x w , b [ 1 / ∣ ∣ w ∣ ∣ m i n i ( y i ( w x i + b ) ) ] argmax_{ w,b} [ 1/∣∣w∣∣min_i (y_i (wx_i +b))] argmaxw,b[1/wmini(yi(wxi+b))]

argmax是最大距离min是找最近的支持向量,因 y i ( w x i + b ) = 1 y_i(wx_i+b)=1 yi(wxi+b)=1 所以就只剩下
当前目标:
m a x w , b 1 / ∣ ∣ w ∣ ∣ max _{w,b }1/∣∣w∣| maxw,b1/w
​因为我们学习算法一般喜欢求最小值损失所以将问题转化为
常规套路:将求解极大值问题转换成极小值问题
在这里插入图片描述
为了方便求导我们就乘了 1 2 \frac{1}{2} 21平方也是为了求导因为 ∣ ∣ w ∣ ∣ ||w|| w是2范数是带根号的也是为了方便求导

求解:应用拉格朗日
问题已经转换为凸二次规划的问题所以可用拉格朗日对偶法求解,前提是我们的目标函数必须是凸函数,因为只有凸函数才能保证存在全局最优解,此时与凸优化联系起来,我们的超平面就是一个凸的。求最优解的问题通常存在以下几个类型

1)无约束: 无约束情况下目标函数为) m i n f ( x ) minf(x) minf(x) 直接使用费马引理对目标函数求导解极值即可
2)等式约束:存在等式 h j ( x ) , j = 1 , 2 , . . . m h_j(x),j=1,2,...m hj(x),j=1,2,...m的情况下,需要使用拉格朗日乘子法对等式引入乘子向量与f(x) m i n f ( x ) minf(x) minf(x) 构造成新的目标函数求解。
3)不等约束:存在不等约束 g i ( x ) < = 0 , i = 1 , 2... n g_i(x)<=0,i=1,2...n gi(x)<=0,i=1,2...n可能还有等式约束 h j ( x ) , j = 1 , 2 , . . . m h_j(x),j=1,2,...m hj(x),j=1,2,...m此时同样需要将这些约束与乘子向量构造新的目标函数,通过KKT条件可解出最优值的必要条件。

【kkt条件】

经过拉格朗日函数处理之后对x求导为0
h i ( x ) = 0 h_i(x)=0 hi(x)=0
g j ( x ) < = 0 g_j(x)<=0 gj(x)<=0
在这里插入图片描述
在这里插入图片描述

软间隔

上述条件是假设在数据完全线性可分的,当数据不完全线性可分存在噪声的时候就需要我们引入松弛因子
在这里插入图片描述

实验部分

from sklearn.svm import SVC
from sklearn import datasets

iris=datasets.load_iris()
#选择所有的样本,取第二个第三个特征
X=iris['data'][:,(2,3)]
y=iris['target']

#取两种分类
setosa_or=(y==0)|(y==1)
X=X[setosa_or]
y=y[setosa_or]

svm_clf=SVC(kernel='linear',C=float('inf'))
svm_clf.fit(X,y)


#数据从0到5.5有200个
x0=np.linspace(0,5.5,200)
#三条曲线
pred_1=5*x0-20
pred_2=x0-1.8
pred_3=0.1*x0+0.5

def plot_svc_decision_boundary(svm_clf,xmin,xmax,sv=True):
    #权重
    w=svm_clf.coef_[0]
    
    #偏置
    b=svm_clf.intercept_[0]
    
    decison_boundary=-w[0]/w[1]*x0-b/w[1]
    margin=1/w[1]
    #上边界
    gutter_up=decison_boundary+margin
    #下边界
    gutter_down=decison_boundary-margin
    if sv:
        svs=svm_clf.support_vectors_
        plt.scatter(svs[:,0],svs[:,1],s=180,facecolors='#FFAAAA')
    plt.plot(x0,decison_boundary,'k-',linewidth=2)
    plt.plot(x0,gutter_up,'k--',linewidth=2)
    plt.plot(x0,gutter_down,'k--',linewidth=2)
plt.figure(figsize=(14,4))
plt.subplot(121)
#黄色蓝色数据点
plt.plot(X[:,0][y==1],X[:,1][y==1],'bs')
plt.plot(X[:,0][y==0],X[:,1][y==0],'ys')
#三条线
plt.plot(x0,pred_1,'g--',linewidth=2)
plt.plot(x0,pred_2,'m--',linewidth=2)
plt.plot(x0,pred_3,'r--',linewidth=2)
plt.axis([0,5.5,0,2])

plt.subplot(122)
plot_svc_decision_boundary(svm_clf,0,5.5)
plt.plot(X[:,0][y==1],X[:,1][y==1],'bs')
plt.plot(X[:,0][y==0],X[:,1][y==0],'ys')
plt.axis([0,5.5,0,2])

效果如下
在这里插入图片描述

举报

相关推荐

0 条评论