支持向量机(Support Vector Machine, SVM)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/winycg/article/details/82830673

感知算法

线性分类器: f ( x ; w , b ) = w , x + b f({\rm{x}};{\rm{w}},b)=\left \langle {\rm{w}},{\rm{x}} \right \rangle+b ,决策: s g n [ f ( x ; w , b ) ] sgn[{f({\rm{x}};{\rm{w}},b)}]
线性感知机(Perception)算法:
输入:训练数据 D = { ( x i , y i ) } i = 1 N D=\{({\rm{x}}_{i},y_{i})\}_{i=1}^{N} ,学习步长 η > 0 \eta>0
输出:感知模型的 w , b {\rm{w}},b
在这里插入图片描述
证明: y i f t + 1 ( x i ) > y i f t ( x i ) y_{i}f^{t+1}({\rm{x}}_{i})>y_{i}f^{t}({\rm{x}}_{i})
y i f t + 1 ( x i ) = y i [ w t + 1 , x i + b t + 1 ] = y i [ w t + η y i x i , x i + b t + η R y i ] = y i [ w t , x i + b t + η y i x i , x i + η R y i ] = y i f t ( x i ) + η ( x i , x i + R ) > y i f t ( x i ) y_{i}f^{t+1}({\rm{x}}_{i})=y_{i}[\left \langle {\rm{w}^{t+1}},{\rm{x}}_{i} \right \rangle+b^{t+1}]\\ =y_{i}[\left \langle {\rm{w}^{t}}+\eta y_{i}{\rm{x}}_{i},{\rm{x}}_{i} \right \rangle+b^{t}+\eta Ry_{i}]\\ =y_{i}[\left \langle {\rm{w}^{t}},{\rm{x}}_{i} \right \rangle+b^{t}+\left \langle \eta y_{i}{\rm{x}}_{i},{\rm{x}}_{i} \right \rangle+\eta Ry_{i}]\\ =y_{i}f^{t}({\rm{x}}_{i})+\eta(\left \langle {\rm{x}}_{i},{\rm{x}}_{i} \right \rangle+R)>y_{i}f^{t}({\rm{x}}_{i})
每次更新都会减少错误。将0替换为 τ > 0 \tau>0 可以得到带边距的感知机。

线性SVM

感知算法的优化目标是最小化分类误差,SVM的优化目标是最大化分类边距,边距是指两个分离的超平面(决策边界)间的距离,位于分类边距上的数据点成为支持向量。图中蓝线所指的就是支持向量。
在这里插入图片描述
计算边距的大小:
在这里插入图片描述
普及知识:直线 f ( x ; w , b ) = w , x + b f({\rm{x}};{\rm{w}},b)=\left \langle {\rm{w}},{\rm{x}} \right \rangle+b 的权重向量 w {\rm{w}} 与直线 f ( x ; w , b ) f({\rm{x}};{\rm{w}},b) 是垂直的。不妨举个例子:设 x + y + 1 = 0 x+y+1=0 ,则权重 w = ( 1 , 1 ) {\rm{w}}=(1,1) ,此时直线和向量 w {\rm{w}} 在坐标系中是垂直的。
假设为如图所示的正边距和负边距,则两者之间的间距为: w , x + + b ( w , x + b ) = w , x + x = 2 \left \langle {\rm{w}},{\rm{x}}^{+} \right \rangle+b-(\left \langle {\rm{w}},{\rm{x}}^{-} \right \rangle+b)=\left \langle {\rm{w}},{\rm{x^{+}-x}}^{-} \right \rangle=2
对于 x + {\rm{x}}^{+} x {\rm{x}}^{-} ,有 x + x = λ w {\rm{x}}^{+}-{\rm{x}}^{-}=\lambda {\rm{w}}
两个公式联立可得: λ w , w = 2 λ = 2 w 2 \lambda \left \langle {\rm{w}},{\rm{w}} \right \rangle=2 \Rightarrow \lambda=\frac{2}{\parallel {\rm{w}}\parallel^{2}}
边距大小 M = x + x = λ w = 2 w M=\parallel {\rm{x}}^{+}-{\rm{x}}^{-}\parallel=\parallel \lambda{\rm{w}} \parallel=\frac{2}{\parallel {\rm{w}}\parallel}
SVM的学习过程归结为寻找合适的 w {\rm{w}} b b

  • 所有的训练数据都在正确的分类区域
    y i ( w , x i + b ) 1 y i { 1 , + 1 } y_{i}(\left \langle {\rm{w}},{\rm{x}}_{i} \right \rangle+b) \geq 1,其中y_{i} \in \{-1, +1\}
  • 最大化边距: max 2 w min w 2 \max \frac{2}{\parallel {\rm{w}}\parallel} \Leftrightarrow\min {\parallel {\rm{w}}\parallel}^{2}
    其中,公式中的1和2都是与分类边距有关。

软边距的SVM
如果不存在一个分类面使得训练数据能够被完美分开,那么边距不再是硬性限制(软边距),需要在优化目标中加入错误惩罚,错误惩罚为出错数据点与正确位置的距离。
优化目标: min w 2 + C i = 1 N ξ i \min {\parallel {\rm{w}}\parallel}^{2}+C\sum_{i=1}^{N}\xi_{i}
约束条件: y i ( w , x i + b ) 1 ξ i , ξ i 0 , i = 1 , 2 , . . . , N y_{i}(\left \langle {\rm{w}},{\rm{x}}_{i} \right \rangle+b) \geq 1-\xi_{i}, \xi_{i} \geq 0,i=1,2,...,N
其中参数 C C 是一个权衡, C C 变大,牺牲了分类间隔,减少了训练集错误。
利用线性SVM对鸢尾花数据集进行分类:

from sklearn.svm import SVC
import numpy as np
from sklearn.preprocessing import StandardScaler
# 数据获取和绘图函数见决策树部分:https://blog.csdn.net/winycg/article/details/82763334
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
svm = SVC(kernel='linear', C=1.0, random_state=0)
svm.fit(X_train_std, y_train)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/winycg/article/details/82830673