SVM支持向量机(Support Vector Mechine)
SVM是一种监督学习算法,常用于解决二分类问题(也可以解决多分类问题),它可以处理线性可分的数据,同时也可以处理线性不可分的数据,广泛应用于分类、回归甚至异常检测等任务。SVM的核心思想是找到数据点之间的最优边界,这个边界能够最大化不同类别之间的间隔。
一、线性可分
线性可分的数据是指至少能够通过一个直线将数据进行分隔开,如下图所示:
数据可以有无数条直线能够分隔开,但是在所有直线中,我们能够直观的感受到,上图中红色的直线分割的效果是最好的,我们对分割直线定义标准:
定义: 直线的参数为 w w w,直线分割的两部分数据与直线的距离为 d 2 \frac{d}{2} 2d,其中 d d d 被称为间隔,间隔d的值越大,我们认为分割直线的效果越好。
我们对数据集以及模型进行符号定义:
-
数据集定义: ( x i ⃗ , y i ⃗ ) (\vec{x_i}, \vec{y_i}) (xi,yi) 含义为 ( 特征向量,标签 ) (特征向量, 标签) (特征向量,标签) ,其中 y y y 的取值为
1
或-1
; -
线性模型: ( w ⃗ , b ) (\vec{w}, b) (w,b), w T x + b = 0 w^Tx + b = 0 wTx+b=0,该函数表示一个超平面(HyperPlane)用于分割数据;
-
训练集线性可分的条件:
对于 ∀ i ( x i ⃗ , y i ) \forall_i (\vec{x_i}, y_i) ∀i(xi,yi), ∃ ( w ⃗ , b ) \exists(\vec{w}, b) ∃(w,b),使得 ∀ i ( x i , y i ⃗ ) \forall_i (\vec{x_i, y_i}) ∀i(xi,yi) 有:
- 若 y i = 1 y_i = 1 yi=1,则 w ⃗ T x ⃗ i T + b ≥ 0 \vec{w}^T \vec{x}_i^T + b \geq 0 wTxiT+b≥0;
- 若 y i = − 1 y_i = -1 yi=−1,则 w ⃗ T x ⃗ i T + b < 0 \vec{w}^T \vec{x}_i^T + b \lt 0 wTxiT+b<0;
可将条件
1
与条件2
进行合并,得: y i ⋅ ( w ⃗ T x ⃗ i + b ≥ 0 ) y_i \cdot (\vec{w}^T \vec{x}_i + b \geq 0) yi⋅(wTxi+b≥0) ;扫描二维码关注公众号,回复: 17466662 查看本文章
知识回顾
1. 平面的缩放
平面 w ⃗ T x ⃗ + b = 0 \vec{w}^T \vec{x} + b = 0 wTx+b=0 与平面 a w ⃗ T x ⃗ + a b = 0 a\vec{w}^T \vec{x} + ab = 0 awTx+ab=0 表示的是同一个平面(其中 a ∈ R + a\in R^+ a∈R+),若 ( w ⃗ , b ) (\vec{w}, b) (w,b)满足公式 y i ⋅ ( w ⃗ T x ⃗ i + b ≥ 0 ) y_i \cdot (\vec{w}^T \vec{x}_i + b \geq 0) yi⋅(wTxi+b≥0),则 ( a w ⃗ , a b ) (a\vec{w}, ab) (aw,ab)也满足公式 y i ⋅ ( w ⃗ T x ⃗ i + b ≥ 0 ) y_i \cdot (\vec{w}^T \vec{x}_i + b \geq 0) yi⋅(wTxi+b≥0)。
2. 点到平面的距离公式
设平面方程为: w 1 x + w 2 x + b = 0 w_1x + w_2x + b = 0 w1x+w2x+b=0,点的坐标为: ( x 0 , y 0 ) (x_0, y_0) (x0,y0)
则点到平面的距离为: d = ∣ w i x 0 + w 2 y 0 + b ∣ w i 2 + w 2 2 d = \frac{|w_ix_0 + w_2y_0 + b|}{\sqrt{w_i^2 + w_2^2}} d=wi2+w22∣wix0+w2y0+b∣ = ∣ w ⃗ T x ⃗ 0 + b ∣ ∣ ∣ w ⃗ 0 ∣ \frac{|\vec{w}^T\vec{x}_0 + b|}{||\vec{w}_0|} ∣∣w0∣∣wTx0+b∣ 这里的 x 0 ⃗ \vec{x_0} x0表示一个向量,包含了 x 0 , y 0 x_0, y_0 x0,y0
我们可以用 a a a 去缩放 ( w ⃗ , b ) (\vec{w}, b) (w,b),最终使得在支持向量 x 0 ⃗ \vec{x_0} x0 上有 ∣ w ⃗ T x ⃗ 0 + b ∣ = 1 |\vec{w}^T\vec{x}_0 + b| = 1 ∣wTx0+b∣=1,此时支持向量与平面距离 d = 1 ∣ ∣ w ⃗ ∣ ∣ d = \frac{1}{||\vec{w}||} d=∣∣w∣∣1
SVM模型(线性可分模型)
支持向量机是需要最大化距离 d d d,直观角度上看,能分割两部分线性可分数据的直线有无数条,但能使 d d d最大的只有一条,因此我们要最大化 d d d,对点到平面的距离进行缩放令距离为1
可得: d = 1 ∣ ∣ w ⃗ ∣ ∣ d = \frac{1}{||\vec{w}||} d=∣∣w∣∣1,即需要最小化 ∣ ∣ w ⃗ ∣ ∣ ||\vec{w}|| ∣∣w∣∣,我们定义:
-
最小化: 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 \frac{1}{2}||\vec{w}||^2 21∣∣w∣∣2
-
限制条件: y i [ w ⃗ T x ⃗ i + b ] ≥ 1 y_i[\vec{w}^T\vec{x}_i + b] \geq 1 yi[wTxi+b]≥1 (这里我们缩放 w ⃗ , b \vec{w}, b w,b使得 w ⃗ T x ⃗ i + b = 1 \vec{w}^T \vec{x}_i + b = 1 wTxi+b=1)
这样转化为了一个二次规划问题。
二次规划问题:
目标函数:二次项
限制条件:一次项
对于二次规划问题,要么是无解的,要么只有一个极值(极值即最值)
硬间隔与软间隔
硬间隔是指直线不容忍任何一个点,严格按照原有数据进行划分,但是这样得到的模型并不是一个好模型,虽然有可能将数据进行分割,但是在使用该模型的时候,并不能有很好的效果,所以对于一些异常点,模型需要有一定的容忍性,因此提出软间隔。
软间隔是指容忍一定的异常数据,然后再对数据进行分割,以此来得到一个性能不错的模型。
为了达到软间隔的目的,我们修改目标函数,以及限制条件如下:
- 最小化: 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 + C ∑ i = 1 N ξ i \frac{1}{2}||\vec{w}||^2 + C\sum\limits_{i = 1} ^ N \xi_i 21∣∣w∣∣2+Ci=1∑Nξi
- 限制条件:
1
. y i [ w ⃗ T x i ⃗ T + b ] ≥ 1 − ξ i y_i [\vec{w}^T \vec{x_i}^T + b] \geq 1 - \xi_i yi[wTxiT+b]≥1−ξi,2
. ξ i ≥ 0 \xi_i \geq 0 ξi≥0
其中 ξ i \xi_i ξi 是一个松弛变量,是为了将硬间隔转换为软间隔而设定的, ξ i \xi_i ξi是一个未知变量,由于 ξ i ≥ 0 \xi_i \geq 0 ξi≥0,所以当 ξ i \xi_i ξi 非常大时,松弛度太高,模型会容忍太多的异常数据,这样会使得参数 w ⃗ \vec{w} w 和 b b b 有很大范围的选择,也就是说会有太多的直线能够满足我们的限制条件
1
,这将会是一个非常糟糕的模型,同样,如果松弛度太小,会导致模型严格按照数据进行划分,这样会考虑所有的异常数据,这样得到的模型也是不好的模型,是一个过拟合现象,为了尽量提高模型的性能,通常我们再添加一个参数 C C C 在松弛变量前,用以限制 ξ i \xi_i ξi的松弛大小。可以将 C ∑ i = 1 N ξ i C\sum\limits_{i = 1} ^ N \xi_i Ci=1∑Nξi 类比为线性模型中的正则项
二、线性不可分
线性不可分是指在特征空间中,数据点不能通过一个线性超平面(直线或超平面)完全分开的情况。支持向量机(SVM)通过使用核技巧将数据映射到更高维空间,在这个高维空间中数据可能是线性可分的,从而可以找到一个线性边界来区分不同的类别。线性不可分的例子如下图:
高维映射
对于线性不可分的数据,我们可以对数据进行高维映射,使其变为一个线性可分的数据,定义高维映射函数为: ϕ ( x ) \phi(x) ϕ(x) ,通过高维映射函数,我们可以将数据映射到一个更高的维度。
高维映射实例:
假设高维映射函数为: ϕ ( x ) = [ a 2 , b 2 , a , b , a b ] \phi(x) = [a^2, b^2, a, b, ab] ϕ(x)=[a2,b2,a,b,ab],且原数据为: x = [ a , b ] x = [a, b] x=[a,b]的格式,则可以将任意的二维数据映射到五维的超平面中,如: x 1 = [ 0 , 1 ] x_1 = [0, 1] x1=[0,1],则: ϕ ( x 1 ) = [ 0 , 1 , 0 , 1 , 0 ] \phi(x_1) = [0, 1, 0, 1, 0] ϕ(x1)=[0,1,0,1,0]。
如果数据的维度可以上升到无限维,那么数据线性可分的概率为1
我们无法知道无限维映射函数 ϕ ( x ) \phi(x) ϕ(x)的显示表达式,但我们可以通过核函数(Kernel Function)来知道高维映射的内积结果:
K ( x 1 , x 2 ) = ϕ ( x 1 ) T ⋅ ϕ ( x 2 ) K(x_1, x_2) = \phi(x_1)^T \cdot \phi(x_2) K(x1,x2)=ϕ(x1)T⋅ϕ(x2)
内积的结果是一个数值。
常用的核函数:
- 高斯核: K ( x 1 , x 2 ) = e − ∣ ∣ x 1 − x 2 ∣ ∣ 2 2 σ 2 K(x_1, x_2) = e^{-\frac{||x_1 - x_2||^2}{2\sigma^2}} K(x1,x2)=e−2σ2∣∣x1−x2∣∣2
- 多项式核(参数
d
表示多项式的阶数): K ( x 1 , x 2 ) = ( x 1 T x 2 + 1 ) d K(x_1, x_2) = (x_1^Tx_2 + 1)^d K(x1,x2)=(x1Tx2+1)d
问题的转化的一般形式(具有非常普适性):
1. 原问题
-
最小化: f ( w ) f(w) f(w)
-
限制条件:
1
. g i ( w ) ≤ 0 ( i = 1 ∼ k ) g_i(w) \leq 0 ~~~~ (i = 1 \sim k) gi(w)≤0 (i=1∼k)2
. h i ( w ) = 0 ( i = 1 ∼ m ) h_i(w) = 0 ~~~~ (i = 1 \sim m) hi(w)=0 (i=1∼m)
2. 原问题转换为对偶问题
定义: L ( w , α , β ) = f ( w ) + ∑ i = 1 K α i g i ( w ) + ∑ i = 1 M β i h i ( w ) L(w, \alpha, \beta) = f(w) + \sum\limits_{i = 1}^{K} \alpha_ig_i(w) + \sum\limits_{i = 1}^{M}\beta_ih_i(w) L(w,α,β)=f(w)+i=1∑Kαigi(w)+i=1∑Mβihi(w)
这里的 α \alpha α是与 g i ( w ) g_i(w) gi(w)进行相乘的,也就是说 α \alpha α是只与所有的不等式限制条件相乘,同理 β \beta β与所有的等式限制条件相乘。
-
最大化: θ ( α , β ) = inf { L ( w , α , β ) } \theta(\alpha, \beta) = \inf\{L(w, \alpha, \beta)\} θ(α,β)=inf{ L(w,α,β)}, inf \inf inf表示求最小值。
-
限制条件: α i ≥ 0 ( i = 1 ∼ k ) \alpha_i \geq 0 ~~~~ (i = 1 \sim k) αi≥0 (i=1∼k)
定理以及性质
如果 w ∗ w^* w∗是原问题的解,而 α ∗ , β ∗ \alpha^*, \beta^* α∗,β∗是对偶问题的解,则有 f ( w ∗ ) ≥ θ ( α ∗ , β ∗ ) f(w^*) \geq \theta(\alpha^*, \beta^*) f(w∗)≥θ(α∗,β∗)
证明:
θ ( α ∗ , β ∗ ) = inf { L ( w , α ∗ , β ∗ ) } ≤ L ( w ∗ , α ∗ , β ∗ ) = f ( w ∗ ) + ∑ i = 1 K α i g i ( w ∗ ) + ∑ i = 1 M β i ∗ h i ( w ∗ ) \theta(\alpha^*, \beta^*) = \inf\{L(w, \alpha^*, \beta^*)\} \leq L(w^*, \alpha^*, \beta^*) = f(w^*) + \sum\limits_{i = 1}^K\alpha_ig_i(w^*) + \sum\limits_{i = 1}^M \beta^*_i h_i(w^*) θ(α∗,β∗)=inf{ L(w,α∗,β∗)}≤L(w∗,α∗,β∗)=f(w∗)+i=1∑Kαigi(w∗)+i=1∑Mβi∗hi(w∗)
因为 α i ≥ 0 \alpha_i \geq 0 αi≥0 并且 g i ( w ∗ ) ≤ 0 g_i(w^*) \leq 0 gi(w∗)≤0 所以 ∑ i = 1 K α i g i ( w ∗ ) ≤ 0 \sum\limits_{i = 1}^K\alpha_ig_i(w^*) \leq 0 i=1∑Kαigi(w∗)≤0,因为 h i ( w ∗ ) = 0 h_i(w^*) = 0 hi(w∗)=0 所以 ∑ i = 1 M β i ∗ h i ( w ∗ ) = 0 \sum\limits_{i = 1}^M \beta^*_i h_i(w^*) = 0 i=1∑Mβi∗hi(w∗)=0
可得: f ( w ∗ ) + ∑ i = 1 K α i g i ( w ∗ ) + ∑ i = 1 M β i ∗ h i ( w ∗ ) ≤ f ( w ∗ ) f(w^*) + \sum\limits_{i = 1}^K\alpha_ig_i(w^*) + \sum\limits_{i = 1}^M \beta^*_i h_i(w^*) \leq f(w^*) f(w∗)+i=1∑Kαigi(w∗)+i=1∑Mβi∗hi(w∗)≤f(w∗)
定义: G = f ( w ∗ ) − θ ( α ∗ , β ∗ ) ≥ 0 G = f(w^*) - \theta(\alpha^*, \beta^*) \geq 0 G=f(w∗)−θ(α∗,β∗)≥0
G G G称为原问题与对偶问题的间距。对于某些特定的优化问题,可以证明 G = 0 G = 0 G=0
强对偶定理
若 f ( w ) f(w) f(w)为凸函数,且 g ( w ) = A w + b , h ( w ) = c w + d g(w) = Aw + b,~ h(w) = cw + d g(w)=Aw+b, h(w)=cw+d,则此优化问题的原问题与对偶问题间距为0,即:
f ( w ∗ ) = θ ( α ∗ , β ∗ ) f(w^*) = \theta(\alpha^*, \beta^*) f(w∗)=θ(α∗,β∗)
凸函数的定义:
对于所有的自变量 w 1 , w 2 w_1, w_2 w1,w2,以及所有的 λ ∈ [ 0 , 1 ] \lambda \in [0, 1] λ∈[0,1], 有 f ( λ w 1 + ( 1 − λ ) w 2 ) ≤ λ f ( w 1 ) + ( 1 − λ ) f ( w 2 ) f(\lambda w_1 + (1 - \lambda)w_2) \leq \lambda f(w_1) + (1 - \lambda)f(w_2) f(λw1+(1−λ)w2)≤λf(w1)+(1−λ)f(w2)
KKT条件
若 f ( w ∗ ) = θ ( α ∗ , β ∗ ) f(w^*) = \theta(\alpha^*, \beta^*) f(w∗)=θ(α∗,β∗),则要么 α ∗ = 0 \alpha^* = 0 α∗=0 要么 g ( w ∗ ) = 0 g(w^*) = 0 g(w∗)=0
SVM中问题的转化
-
最小化: 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 + C ∑ i = 1 N ξ i \frac{1}{2}||\vec{w}||^2 + C\sum\limits_{i = 1}^N \xi_i 21∣∣w∣∣2+Ci=1∑Nξi , 这是一个凸函数。
-
限制条件:1. y i [ w ⃗ T ϕ ( x i ⃗ ) + b ] ≥ 1 − ξ i y_i[\vec{w}^T\phi(\vec{x_i}) + b] \geq 1 - \xi_i yi[wTϕ(xi)+b]≥1−ξi, 2. ξ i ≥ 0 \xi_i \geq 0 ξi≥0
转化为原问题:
-
最小化: 1 2 ∣ ∣ ] w ⃗ ∣ ∣ 2 − C ∑ i = 1 N ξ i \frac{1}{2}||]\vec{w}||^2 - C \sum\limits_{i = 1}^N \xi_i 21∣∣]w∣∣2−Ci=1∑Nξi
-
限制条件:
1
. 1 + ξ i − y i w ⃗ T ϕ ( x i ⃗ ) + y i b ≤ 0 1 + \xi_i - y_i\vec{w}^T \phi(\vec{x_i}) + y_ib \leq 0 1+ξi−yiwTϕ(xi)+yib≤0,2
. ξ i ≤ 0 \xi_i \leq 0 ξi≤0
转化为对偶问题
- 最大化: θ ( α , β ) = inf 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 − C ∑ i = 1 N ξ i + ∑ i = 1 N β i ξ i + ∑ i = 1 N α i [ 1 + ξ i − y i w ⃗ T ϕ ( x i ⃗ ) − y i b ] \theta(\alpha, \beta) = \inf{\frac{1}{2}||\vec{w}||^2 - C\sum\limits_{i = 1}^{N}\xi_i + \sum\limits_{i = 1}^N \beta_i\xi_i + \sum\limits_{i = 1}^N \alpha_i[1 + \xi_i - y_i\vec{w}^T\phi(\vec{x_i}) - y_ib]} θ(α,β)=inf21∣∣w∣∣2−Ci=1∑Nξi+i=1∑Nβiξi+i=1∑Nαi[1+ξi−yiwTϕ(xi)−yib]
(注:这里的 β \beta β与 α \alpha α都对应着朴实问题中的 α \alpha α,因为 α \alpha α对应着不等式限制条件,这样写只是便于直观察看)
- 限制条件:
1
. α i ≥ 0 ( i = 1 ∼ N ) \alpha_i \geq 0 ~~~~ (i = 1 \sim N) αi≥0 (i=1∼N),2
. β i ≥ 0 ( i = 1 ∼ N ) \beta_i \geq 0 ~~~~ (i = 1 \sim N) βi≥0 (i=1∼N)
我们可以对 L L L的各个参数求导,并令其等于0,这样找到的是函数 L L L的极值(这里的极值就是最值)情况:
- ∂ L ∂ w = 0 = > w − ∑ i = 1 N α i y i ϕ ( x i ) = 0 = > w = ∑ i = 1 N α i y i ϕ ( x i ) \frac{\partial{L}}{\partial{w}} = 0 => w - \sum\limits_{i = 1}^{N}\alpha_i y_i \phi(x_i) = 0 => w = \sum\limits_{i = 1}^N \alpha_i y_i \phi(x_i) ∂w∂L=0=>w−i=1∑Nαiyiϕ(xi)=0=>w=i=1∑Nαiyiϕ(xi)
- ∂ L ∂ ξ i = 0 = > − C + β i + α i = 0 = > β i + α i = C \frac{\partial{L}}{\partial{\xi_i}} = 0 => -C + \beta_i + \alpha_i = 0 => \beta_i + \alpha_i = C ∂ξi∂L=0=>−C+βi+αi=0=>βi+αi=C
- ∂ L ∂ b = 0 = > ∑ i = 1 N α i y i = 0 \frac{\partial{L}}{\partial{b}} = 0 => \sum\limits_{i = 1}^{N} \alpha_i y_i = 0 ∂b∂L=0=>i=1∑Nαiyi=0
将以上三个等式带入到 θ ( α , β ) \theta(\alpha, \beta) θ(α,β)后,可求得最小化 w ⃗ , ξ i , b \vec{w}, \xi_i, b w,ξi,b这三个变量,导入后得:
θ ( α , β ) = 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 ⏟ 1 + ∑ i = 1 N α i ⏟ 2 + ∑ i = 1 N α i y i w T ϕ ( x ⃗ ) ⏟ 3 \theta(\alpha, \beta) = \underbrace{\frac{1}{2} ||\vec{w}||^2}_{1} +\underbrace{\sum\limits_{i = 1}^N \alpha_i}_{2} + \underbrace{\sum\limits_{i = 1}^N \alpha_i y_i w^T \phi(\vec{x})}_3 θ(α,β)=1
21∣∣w∣∣2+2
i=1∑Nαi+3
i=1∑NαiyiwTϕ(x)
将每一项展开带入得:
- 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 = 1 2 ( ∑ i = 1 N α i y i ϕ ( x i ⃗ ) ) ⋅ ( ∑ j = 1 N α j y j ϕ ( x j ⃗ ) ) = 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( ϕ ( x i ⃗ ) ϕ ( x j ⃗ ) ) = 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j K ( x i ⃗ , x j ⃗ ) \frac{1}{2}||\vec{w}||^2 = \frac{1}{2}(\sum\limits_{i = 1}^{N} \alpha_i y_i \phi{(\vec{x_i})}) \cdot (\sum\limits_{j = 1}^{N} \alpha_j y_j \phi(\vec{x_j})) = \frac{1}{2} \sum\limits_{i = 1}^N \sum\limits_{j = 1}^N \alpha_i \alpha_j y_i y_j (\phi(\vec{x_i}) \phi(\vec{x_j})) = \frac{1}{2} \sum\limits_{i = 1}^N \sum\limits_{j = 1}^N \alpha_i \alpha_j y_i y_j K(\vec{x_i}, \vec{x_j}) 21∣∣w∣∣2=21(i=1∑Nαiyiϕ(xi))⋅(j=1∑Nαjyjϕ(xj))=21i=1∑Nj=1∑Nαiαjyiyj(ϕ(xi)ϕ(xj))=21i=1∑Nj=1∑NαiαjyiyjK(xi,xj)
- ∑ i = 1 N α i \sum\limits_{i = 1}^N \alpha_i i=1∑Nαi
- − ∑ i = 1 N α i y i w T ϕ ( x i ⃗ ) = − ∑ i = 1 N α i y i ( ∑ j = 1 N α j y j ϕ ( x j ⃗ ) T ϕ ( x j ⃗ ) ) = − ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( ϕ ( x i ⃗ ) ϕ ( x j ⃗ ) ) = − ∑ i = 1 N ∑ j = 1 N α i α j y i y j K ( x i ⃗ , x j ⃗ ) -\sum\limits_{i = 1}^{N} \alpha_i y_i w^T \phi(\vec{x_i}) = -\sum\limits_{i = 1}^N \alpha_i y_i(\sum\limits_{j = 1}^N \alpha_j y_j \phi(\vec{x_j})^T \phi(\vec{x_j})) = -\sum\limits_{i = 1}^N \sum\limits_{j = 1}^N\alpha_i \alpha_j y_i y_j (\phi(\vec{x_i}) \phi(\vec{x_j})) = -\sum\limits_{i = 1}^N \sum\limits_{j = 1}^N\alpha_i \alpha_j y_i y_j K(\vec{x_i}, \vec{x_j}) −i=1∑NαiyiwTϕ(xi)=−i=1∑Nαiyi(j=1∑Nαjyjϕ(xj)Tϕ(xj))=−i=1∑Nj=1∑Nαiαjyiyj(ϕ(xi)ϕ(xj))=−i=1∑Nj=1∑NαiαjyiyjK(xi,xj)
带入到 θ ( α , β ) \theta(\alpha, \beta) θ(α,β)化简可得:
θ ( α , β ) = ∑ i = 1 N α i − 1 2 ∑ i = i N ∑ j = 1 N α i α j y i y j K ( x i ⃗ , x j ⃗ ) \theta(\alpha, \beta) = \sum\limits_{i = 1}^N \alpha_i - \frac{1}{2}\sum\limits_{i = i}^N \sum\limits_{j = 1}^N \alpha_i \alpha_j y_i y_j K(\vec{x_i}, \vec{x_j}) θ(α,β)=i=1∑Nαi−21i=i∑Nj=1∑NαiαjyiyjK(xi,xj)
此时问题转化为:
-
最大化: θ ( α , β ) = ∑ i = 1 N α i − 1 2 ∑ i = i N ∑ j = 1 N α i α j y i y j K ( x i ⃗ , x j ⃗ ) \theta(\alpha, \beta) = \sum\limits_{i = 1}^N \alpha_i - \frac{1}{2}\sum\limits_{i = i}^N \sum\limits_{j = 1}^N \alpha_i \alpha_j y_i y_j K(\vec{x_i}, \vec{x_j}) θ(α,β)=i=1∑Nαi−21i=i∑Nj=1∑NαiαjyiyjK(xi,xj)
-
限制条件:
1
. 0 ≤ α i ≤ C 0 \leq \alpha_i \leq C 0≤αi≤C ,2
. ∑ i = 1 N α i y i = 0 \sum\limits_{i = 1}^N \alpha_i y_i = 0 i=1∑Nαiyi=0
限制条件1
的推导过程: α ≥ 0 , β i ≥ 0 , α i + β i = C \alpha \geq 0, ~~~~ \beta_i \geq 0, ~~~~ \alpha_i + \beta_i = C α≥0, βi≥0, αi+βi=C
此时我们最需要求解出参数 α ⃗ \vec{\alpha} α即可,可以使用 SMO算法 来求解。
测试流程
设新样本为: x ⃗ \vec{x} x
已知模型如下:
-
若: w ⃗ T ϕ ( x ⃗ ) + b ≥ 0 \vec{w}^T \phi(\vec{x}) + b \geq 0 wTϕ(x)+b≥0, 则 y = 1 y = 1 y=1
-
若: w ⃗ T ϕ ( x ⃗ ) + b ≤ 0 \vec{w}^T \phi(\vec{x}) + b \leq 0 wTϕ(x)+b≤0,则 y = − 1 y = -1 y=−1
1. 计算 w ⃗ T ϕ ( x ⃗ ) \vec{w}^T\phi(\vec{x}) wTϕ(x)
w ⃗ T ϕ ( x ⃗ ) = ∑ i = 1 N [ α i y i ϕ ( x i ⃗ ) ⃗ ] T ϕ ( x ⃗ ) = ∑ i = 1 N α i ⃗ y i ϕ ( x i ⃗ ) ϕ ( x ⃗ ) = ∑ i = 1 N α i ⃗ y i K ( x i ⃗ , x ⃗ ) \vec{w}^T \phi(\vec{x}) = \sum\limits_{i = 1}^N[\vec{\alpha_i y_i \phi(\vec{x_i})}]^T \phi(\vec{x}) = \sum\limits_{i = 1}^N \vec{\alpha_i} y_i \phi(\vec{x_i})\phi{(\vec{x})} = \sum\limits_{i = 1}^N \vec{\alpha_i} y_i K(\vec{x_i}, \vec{x}) wTϕ(x)=i=1∑N[αiyiϕ(xi)]Tϕ(x)=i=1∑Nαiyiϕ(xi)ϕ(x)=i=1∑NαiyiK(xi,x)
2. 计算 b b b
KKT条件: ∀ i = 1 ∼ K \forall_i = 1 \sim K ∀i=1∼K, α i ∗ = 0 \alpha_i^* = 0 αi∗=0 或 g i ( w ∗ ⃗ ) = 0 g_i(\vec{w^*}) = 0 gi(w∗)=0
(注: α i ∗ \alpha_i^* αi∗ 是与不等式条件组合,因此对应参数 β i \beta_i βi与 α i \alpha_i αi)
在SVM中: ∀ i = 1 ∼ N \forall_i = 1 \sim N ∀i=1∼N
- 要么 β i = 0 \beta_i = 0 βi=0,要么 ξ i = 0 \xi_i = 0 ξi=0
- 要么 α i = 0 \alpha_i = 0 αi=0,要么 1 + ξ i − y i w ⃗ T ϕ ( x i ⃗ ) − y i b = 0 1 + \xi_i - y_i\vec{w}^T \phi(\vec{x_i}) - y_ib = 0 1+ξi−yiwTϕ(xi)−yib=0
这里取 0 < α i < 0 0 \lt \alpha_i \lt 0 0<αi<0,则 β i = C − α i > 0 \beta_i = C - \alpha_i \gt 0 βi=C−αi>0,此时 β i ≠ 0 \beta_i \not= 0 βi=0,则 ξ i = 0 \xi_i = 0 ξi=0, α i ≠ 0 \alpha_i \not= 0 αi=0,则 1 + ξ i − y i w ⃗ T ϕ ( x i ⃗ ) − y i b = 0 1 + \xi_i - y_i \vec{w}^T \phi(\vec{x_i}) - y_i b = 0 1+ξi−yiwTϕ(xi)−yib=0。如此,即可算出:
b = 1 − y i w ⃗ T ϕ ( x i ⃗ ) y i = 1 − y i ∑ j = 1 N α j y j K ( x i , y j ) y i b = \frac{1 - y_i \vec{w}^T \phi(\vec{x_i})}{y_i} = \frac{1 - y_i\sum\limits_{j = 1}^{N}\alpha_j y_j K(x_i, y_j)}{y_i} b=yi1−yiwTϕ(xi)=yi1−yij=1∑NαjyjK(xi,yj)
三、SMO算法*(选看)
SMO算法是一个启发式算法,对于SMO算法,其最终要解决的问题为:
m a x : ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i y i α j y j K ( x i ⃗ , x j ⃗ ) = L ( α ⃗ ) max: \sum\limits_{i = 1}^m \alpha_i - \frac{1}{2}\sum\limits_{i = 1}^m \sum\limits_{j = 1}^m \alpha_i y_i \alpha_j y_j K(\vec{x_i}, \vec{x_j}) = L(\vec{\alpha}) max:i=1∑mαi−21i=1∑mj=1∑mαiyiαjyjK(xi,xj)=L(α)
条件: ∑ i = 1 m α i y i = 0 \sum\limits_{i = 1}^m \alpha_i y_i = 0 i=1∑mαiyi=0
我们要求得所有 α \alpha α的值,一个简单的思路是固定其它所有 α \alpha α,只单独求一个 α \alpha α,直至迭代所有的 α \alpha α,但是这样是行不通的,对于限制条件 ∑ i = 1 m α i y i = 0 \sum\limits_{i = 1}^m \alpha_i y_i = 0 i=1∑mαiyi=0,如果我们一个 α \alpha α一个 α \alpha α的求,因为固定了其它 α \alpha α,则需要求的 α \alpha α也是一个已知的数,这是无法求解的。
因此,我们每次求两个变量,如: α 1 , α 2 \alpha_1, \alpha_2 α1,α2然后再求 α 3 , α 4 , ⋯ \alpha_3, \alpha_4, \cdots α3,α4,⋯;
初始变量的时候,我们可以随机取 m m m个小值赋给每个 α \alpha α
令: L = m a x ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i y i α j y j K ( x i ⃗ , x j ⃗ ) L = max{\sum\limits_{i = 1}^m \alpha_i - \frac{1}{2}\sum\limits_{i = 1}^m \sum\limits_{j = 1}^m \alpha_i y_i \alpha_j y_j K(\vec{x_i}, \vec{x_j})} L=maxi=1∑mαi−21i=1∑mj=1∑mαiyiαjyjK(xi,xj),且 ∑ i = 1 m α i y i = 0 \sum\limits_{i = 1}^m \alpha_i y_i = 0 i=1∑mαiyi=0
由于求解每一对 α \alpha α的方法是相同的,这里以求 α 1 , α 2 \alpha_1,\alpha_2 α1,α2为例:
求解参数 α 1 α 2 \alpha_1 \alpha_2 α1α2
L ( α 1 , α 2 ) = α 1 + α 2 + ∑ i = 3 m α i − 1 2 [ α 1 y 1 α 1 y 1 K ( x 1 ⃗ , x 1 ⃗ ) + 2 α 1 y 1 α 2 y 2 K ( x 1 ⃗ , x 2 ⃗ ) + 2 ∑ i = 3 m α 1 y 1 α i y i K ( x 1 ⃗ , x i ⃗ ) + α 2 y 2 α 2 y 2 K ( x 2 ⃗ , x 2 ⃗ ) + 2 ∑ i = 3 m α 2 y 2 α i y i K ( x 2 ⃗ , x i ⃗ ) + ∑ i = 3 m ∑ j = 3 m α i y i α j y j K ( x i ⃗ , x j ⃗ ) ] L(\alpha_1, \alpha_2) = \alpha_1 + \alpha_2 + \sum\limits_{i = 3}^{m}\alpha_i - \frac{1}{2}[\alpha_1y_1\alpha_1y_1K(\vec{x_1} , \vec{x_1}) + 2\alpha_1 y_1 \alpha_2 y_2K(\vec{x_1}, \vec{x_2}) + 2\sum\limits_{i = 3}^m \alpha_1 y_1 \alpha_i y_i K(\vec{x_1}, \vec{x_i}) + \alpha_2 y_2 \alpha_2 y_2 K(\vec{x_2}, \vec{x_2}) \\ + 2\sum\limits_{i = 3}^m \alpha_2 y_2 \alpha_i y_i K(\vec{x_2}, \vec{x_i}) + \sum\limits_{i = 3}^m \sum\limits_{j = 3}^m \alpha_i y_i \alpha_j y_j K(\vec{x_i}, \vec{x_j})] L(α1,α2)=α1+α2+i=3∑mαi−21[α1y1α1y1K(x1,x1)+2α1y1α2y2K(x1,x2)+2i=3∑mα1y1αiyiK(x1,xi)+α2y2α2y2K(x2,x2)+2i=3∑mα2y2αiyiK(x2,xi)+i=3∑mj=3∑mαiyiαjyjK(xi,xj)]
定义: K i j = K ( x i ⃗ , x j ⃗ ) K_{ij} = K(\vec{x_i}, \vec{x_j}) Kij=K(xi,xj)
由于 ∑ i = 3 m α i \sum\limits_{i = 3}^{m}\alpha_i i=3∑mαi和 ∑ i = 3 m ∑ j = 3 m α i y i α j y j K ( x i ⃗ , x j ⃗ ) \sum\limits_{i = 3}^m \sum\limits_{j = 3}^m \alpha_i y_i \alpha_j y_j K(\vec{x_i}, \vec{x_j}) i=3∑mj=3∑mαiyiαjyjK(xi,xj)是一个常数项,可以进行省略。由于 y = 1 y = 1 y=1或 y = − 1 y = -1 y=−1,因此一定有: y 2 = 1 y^2 = 1 y2=1
化简转换得: L ‘ ( α 1 , α 2 ) = α 1 + α 2 − 1 2 [ α 1 2 K 11 + 2 α 1 y 1 α 2 y 2 K 12 + 2 ∑ i = 3 m α 1 y 1 α i y i K 1 i + α 2 2 K 22 + 2 ∑ i = 3 m α 2 y 2 α i y i K 2 i ] L^`(\alpha_1, \alpha_2) = \alpha_1 + \alpha_2 - \frac{1}{2}[\alpha_1^2 K_{11} + 2\alpha_1 y_1 \alpha_2 y_2 K_{12} + 2\sum\limits_{i = 3}^m \alpha_1 y_1 \alpha_i y_i K_{1i} + \alpha_2^2 K_{22} + 2\sum\limits_{i = 3}^m \alpha_2 y_2 \alpha_i y_i K_{2i}] L‘(α1,α2)=α1+α2−21[α12K11+2α1y1α2y2K12+2i=3∑mα1y1αiyiK1i+α22K22+2i=3∑mα2y2αiyiK2i]
因为限制条件: ∑ i = 1 m α i y i = 0 \sum\limits_{i = 1}^m \alpha_i y_i = 0 i=1∑mαiyi=0,所以有: α 1 y 1 + α 2 y 2 + ∑ i = 3 m α i y i = 0 \alpha_1 y_1 + \alpha_2 y_2 + \sum\limits_{i = 3}^m \alpha_i y_i = 0 α1y1+α2y2+i=3∑mαiyi=0
令: ∑ i = 3 m α i y i = − ( α 1 y 1 + α 2 y 2 ) = − C \sum\limits_{i = 3}^m \alpha_i y_i = -(\alpha_1 y_1 + \alpha_2 y_2) = -C i=3∑mαiyi=−(α1y1+α2y2)=−C,则有: α 1 y 1 + α 2 y 2 = C \alpha_1 y_1 + \alpha_2 y_2 = C α1y1+α2y2=C,可得: α 1 = y 1 ( C − α 2 y 2 ) \alpha_1 = y_1(C - \alpha_2 y_2) α1=y1(C−α2y2)
将 α 1 \alpha_1 α1带入 L ‘ ( α 1 , α 2 ) L^`(\alpha_1, \alpha_2) L‘(α1,α2)得:
L ( α 2 ) = y 1 ( C − α 2 y 2 ) + α 2 − 1 2 [ ( C − α 2 y 2 ) 2 K 11 + 2 ( C − α 2 y 2 ) α 2 y 2 K 12 + α 2 2 K 22 + 2 ∑ i = 3 m ( C − α 2 y 2 ) α i y i K 1 i + 2 ∑ i = 3 m α 2 y 2 α i y i K 2 i ] L(\alpha_2) = y_1(C - \alpha_2y_2) + \alpha_2 - \frac{1}{2}[(C - \alpha_2 y_2)^2K_{11} + 2(C - \alpha_2 y_2)\alpha_2y_2 K_{12} + \alpha_2^2K_{22} + 2\sum\limits_{i = 3}^m(C - \alpha_2y_2) \alpha_iy_i K_{1i} + 2\sum\limits_{i = 3}^m \alpha_2 y_2 \alpha_i y_i K_{2i}] L(α2)=y1(C−α2y2)+α2−21[(C−α2y2)2K11+2(C−α2y2)α2y2K12+α22K22+2i=3∑m(C−α2y2)αiyiK1i+2i=3∑mα2y2αiyiK2i]
对 α 2 \alpha_2 α2求导得:
∂ L ∂ α 2 = − y 1 y 2 + 1 − 1 2 [ 2 ( C − α 2 y 2 ) ( − y 2 ) K 11 + 2 C y 2 K 12 − 4 α 2 K 12 + 2 α 2 K 22 − 2 ∑ i = 3 m y 2 α i y i K 1 i + ∑ i = 3 m y 2 α i y i K 2 i ] = 1 − y 1 y 2 + C y 2 K 11 − α 2 K 11 − C y 2 K 12 + 2 α 2 K 12 − α 2 K 22 + ∑ i = 3 m y 2 α i y i K 1 i − ∑ i = 3 m y 2 α i y i K 2 i \frac{\partial{L}}{\partial{\alpha_2}} = -y_1y_2 + 1 -\frac{1}{2}[2(C - \alpha_2y_2)(-y_2)K_{11} + 2Cy_2K_{12} - 4\alpha_2K_{12} + 2\alpha_2K_{22} - 2\sum\limits_{i = 3}^m y_2 \alpha_i y_i K_{1i} + \sum\limits_{i = 3}^m y_2 \alpha_i y_i K_{2i}] \\ = 1 - y_1y_2 + Cy_2 K_{11} - \alpha_2K_{11} - Cy_2K_{12} + 2\alpha_2 K_{12} - \alpha_2K_{22} + \sum\limits_{i = 3}^m y_2 \alpha_i y_i K_{1i} - \sum\limits_{i = 3}^m y_2\alpha_i y_i K_{2i} ∂α2∂L=−y1y2+1−21[2(C−α2y2)(−y2)K11+2Cy2K12−4α2K12+2α2K22−2i=3∑my2αiyiK1i+i=3∑my2αiyiK2i]=1−y1y2+Cy2K11−α2K11−Cy2K12+2α2K12−α2K22+i=3∑my2αiyiK1i−i=3∑my2αiyiK2i
令 ∂ L ∂ α 2 = 0 \frac{\partial{L}}{\partial{\alpha_2}} = 0 ∂α2∂L=0,并提取 α 2 \alpha_2 α2:
α 2 n e w ( K 11 + K 22 − 2 K 12 ) = 1 − y 1 y 2 + C y 2 K 11 − C y 2 K 12 + ∑ i = 3 m y 2 α i y i K 1 i − ∑ i = 3 m y 2 α i y i K 2 i = y 2 ( y 2 − y 1 + C K 11 − C K 12 − ∑ i = 3 m α i y i K 1 i − ∑ i = 3 m α i y i K 2 i ) \alpha_2^{new}(K_{11} + K_{22} - 2K_{12}) = 1 - y_1y_2 + Cy_2 K_{11} - Cy_2K_{12} + \sum\limits_{i = 3}^m y_2 \alpha_i y_i K_{1i} - \sum\limits_{i = 3}^m y_2\alpha_iy_iK_{2i} \\ = y_2(y_2 - y_1 + CK_{11} - CK_{12} - \sum\limits_{i = 3}^m \alpha_i y_i K_{1i} - \sum\limits_{i = 3}^m \alpha_i y_i K_{2i}) α2new(K11+K22−2K12)=1−y1y2+Cy2K11−Cy2K12+i=3∑my2αiyiK1i−i=3∑my2αiyiK2i=y2(y2−y1+CK11−CK12−i=3∑mαiyiK1i−i=3∑mαiyiK2i)
已知: α 1 o l d y 1 + α 2 o l d y 2 = C \alpha_1^{old}y_1 + \alpha_2^{old}y_2 = C α1oldy1+α2oldy2=C,可以替换公式中的 C C C,可得:
α 2 n e w ( K 11 + K 22 − 2 K 12 ) = y 2 ( y 2 − y 1 + α 1 o l d y 1 K 11 + α 2 o l d y 2 K 11 − α 1 o l d y 1 K 12 − α 2 o l d y 2 K 12 + f ( x 1 ) − α 1 o l d y 1 K 11 − α 2 o l d y 2 k 12 − b ⏟ @ 1 − f ( x 2 ) + α 1 o l d y 1 K 12 + α 2 o l d y 2 K 22 + b ⏟ @ 2 ) \alpha_2^{new}(K_{11} + K_{22} - 2K_{12}) = y_2(y_2 - y_1 + \alpha_1^{old}y_1K_{11} + \alpha_2^{old}y_2K_{11} - \alpha_1^{old}y_1K_{12} - \alpha_2^{old}y_2K_{12} \\+ \underbrace{ f(x_1) - \alpha_1^{old}y_1K_{11} - \alpha_2^{old}y_2 k_{12} - b}_{@1} - \underbrace{f(x_2) + \alpha_1^{old}y_1K_{12} + \alpha_2^{old} y_2 K_{22} + b}_{@2}) α2new(K11+K22−2K12)=y2(y2−y1+α1oldy1K11+α2oldy2K11−α1oldy1K12−α2oldy2K12+@1
f(x1)−α1oldy1K11−α2oldy2k12−b−@2
f(x2)+α1oldy1K12+α2oldy2K22+b)
@1 与 @2的推导过程:
有SVM推论过程有: ∂ L ∂ w = > w = ∑ i = 1 m α i y i x i \frac{\partial{L}}{\partial{w}} => w = \sum\limits_{i = 1}^m \alpha_i y_i x_i ∂w∂L=>w=i=1∑mαiyixi,所以可得: f ( x ) = w T x + b = ∑ i = 1 m α i y i x i T x + b f(x) = w^Tx + b = \sum\limits_{i = 1}^m \alpha_iy_i x_i^T x + b f(x)=wTx+b=i=1∑mαiyixiTx+b
对于 f ( x 1 ) f(x_1) f(x1),可得公式: f ( x 1 ) = α 1 y 1 x 1 T x 1 + α 2 y 2 x 2 T x 1 + ∑ i = 3 m α i y i x i T x 1 + b f(x_1) = \alpha_1 y_1 x_1^Tx_1 + \alpha_2y_2x_2^Tx_1 + \sum\limits_{i = 3}^m \alpha_i y_ix_i^Tx_1 + b f(x1)=α1y1x1Tx1+α2y2x2Tx1+i=3∑mαiyixiTx1+b
从而可以推理出: ∑ i = 3 m α i y i K 1 i = f ( x 1 ) − α 1 y 1 K 11 − α 2 y 2 K 12 − b \sum\limits_{i = 3}^m \alpha_i y_i K_{1i} = f(x_1) - \alpha_1 y_1 K_{11} - \alpha_2 y_2 K_{12} - b i=3∑mαiyiK1i=f(x1)−α1y1K11−α2y2K12−b
同理: ∑ i = 3 m α i y i K 2 i = f ( x 2 ) − α 1 y 1 K 12 − α 2 y 2 K 22 − b = y 2 [ f ( x 1 ) − y 1 − ( f ( x 2 ) − y 2 + α 2 o l d y 2 ( K 11 + K 22 − 2 K 12 ) ] \sum\limits_{i = 3}^m \alpha_i y_i K_{2i} = f(x_2) - \alpha_1 y_1 K_{12} - \alpha_2y_2K_{22} - b = y_2[f(x_1) - y_1 -(f(x_2) - y_2 + \alpha_2^{old}y_2(K_{11} +K_{22} -2K_{12})] i=3∑mαiyiK2i=f(x2)−α1y1K12−α2y2K22−b=y2[f(x1)−y1−(f(x2)−y2+α2oldy2(K11+K22−2K12)]
定义通式
令 f ( x 1 ) − y 1 = E 1 f(x_1) - y_1 = E_1 f(x1)−y1=E1, f ( x 2 ) − y 2 = E 2 f(x_2) - y_2 = E_2 f(x2)−y2=E2, K 11 + K 22 − 2 K 12 = η K_{11} + K_{22} - 2K_{12} = \eta K11+K22−2K12=η
则有: α 2 n e w η = y 2 ( E 1 − E 2 + α 2 o l d y 2 η ) \alpha_2^{new} \eta = y_2(E_1 - E_2 + \alpha_2^{old}y_2 \eta) α2newη=y2(E1−E2+α2oldy2η),可推出: α 2 n e w = α 2 o l d + y 2 ( E 1 − E 2 ) η \alpha_2^{new} = \alpha_2^{old} + \frac{y_2(E_1 - E_2)}{\eta} α2new=α2old+ηy2(E1−E2),这样求出 α 2 n e w \alpha_2^{new} α2new即可求出 α 1 n e w \alpha_1^{new} α1new
代码实验
实验一、线性可分
1. 加载数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
from scipy.io import loadmat
raw_data = loadmat("ex6data1.mat") # 加载matlab格式的数据集
raw_data
2. 数据可视化
data = pd.DataFrame(raw_data['X'],columns=['X1','X2'])
data['y'] = raw_data['y']
positive = data[data['y'].isin([1])]
negative = data[data['y'].isin([0])]
fig,ax = plt.subplots(figsize = (12,8))
ax.scatter(positive['X1'],positive['X2'],s = 50,marker = 'x',label = 'Positive')
ax.scatter(negative['X1'],negative['X2'],s = 50,marker = 'o',label = 'Negative')
ax.legend()
plt.show()
3. 设定模型
svm.LinearSVC()
用于分类问题,svm.LinearSVR()
用于回归问题。
svm.LinearSVC()
参数讲解:
C
:正则化参数,正则化的强度与C
成反比,必须严格为正loss
:定义损失函数,默认为squared_hinge
max_iter
:指定优化算法的最大迭代次数dual
:指定是使用对偶算法还是原始问题的算法来解决优化问题。当样本数量大于特征数量时,推荐设置为False
tol
: 指定优化算法的容忍度,用于确定算法何时停止random_state
: 控制随机数生成的种子,用于数据的随机打乱
from sklearn import svm
svc = svm.LinearSVC(C = 1,loss = 'hinge',max_iter = 10000, dual=True) #C越大就会趋向分类正确
svc
4. 模型拟合
svc.fit(data[['X1','X2']],data['y'])
svc.score(data[['X1','X2']],data['y'])
5. 增大C的值,重新进行拟合
C的值是用于调整软间隔的,如果C的值过小,则会导致模型过拟合,C的值过大,会导致模型欠拟合。
svc2 = svm.LinearSVC(C =100,loss = 'hinge',max_iter = 50000, dual=True)
svc2.fit(data[['X1','X2']],data['y'])
svc2.score(data[['X1','X2']],data['y'])
6. 对比两个模型的效果
data['SVM 1 Confidence'] = svc.decision_function(data[['X1','X2']]) # 可以表示可信度,颜色越深表示可信度越高,否则可信度越低
fig,ax = plt.subplots(figsize = (12,8))
ax.scatter(data['X1'],data['X2'],s = 50,c = data['SVM 1 Confidence'],cmap = 'seismic')
ax.set_title('SVM (C = 1) Decision Confidence')
plt.show()
data['SVM 2 Confidence'] = svc2.decision_function(data[['X1','X2']])
fig,ax = plt.subplots(figsize = (12,8))
ax.scatter(data['X1'],data['X2'],s = 50,c = data['SVM 2 Confidence'],cmap = 'seismic')
ax.set_title('SVM (C = 100) Decision Confidence')
plt.show()
实验二、线性不可分
1. 定义高斯核函数
def gaussian_kernel(x1,x2,sigma):
#INPUT:连个维度的值x1,x2,高斯核参数sigma
#OUTPUT:高斯核函数计算后的值
#TODO:根据参数和上输入的数据计算高斯核函数
#STEP:计算高斯核函数,这里的输入时向量化
return np.exp(-(np.sum((x1 - x2)**2)/(2*(sigma**2))))
2. 测试高斯核函数
x1 = np.array([1.0,2.0,1.0])
x2 = np.array([0.0,4.0,-1.0])
sigma = 2
gaussian_kernel(x1,x2,sigma)
3. 加载数据集并进行数据可视化
raw_data = loadmat("ex6data2.mat")
data = pd.DataFrame(raw_data['X'],columns=['X1','X2'])
data['y'] = raw_data['y']
positive = data[data['y'].isin([1])]
negative = data[data['y'].isin([0])]
fig,ax = plt.subplots(figsize = (12,8))
ax.scatter(positive['X1'],positive['X2'],s = 30,marker = 'x',label = 'Positive')
ax.scatter(negative['X1'],negative['X2'],s = 30,marker = 'o',label = 'Negative')
ax.legend()
plt.show()
4. 设定模型
svc = svm.SVC(C = 100,gamma=10,probability=True)
svc
5. 模型拟合
svc.fit(data[['X1','X2']],data['y'])
svc.score(data[['X1','X2']],data['y'])
6. 模型效果展示
data['Probability'] = svc.predict_proba(data[['X1','X2']])[:,0]
fig,ax = plt.subplots(figsize = (12,8))
ax.scatter(data['X1'],data['X2'],s = 30,c = data['Probability'],cmap = 'Reds')
plt.show()
实验三、寻找最优参数
raw_data = loadmat("ex6data3.mat")
X = raw_data['X']
Xval = raw_data['Xval']
y = raw_data['y'].ravel()
yval = raw_data['yval'].ravel()
#设置可选参数
C_values = [0.01,0.03,0.1,0.3,1,3,10,30,100]
gamma_values = [0.01,0.003,0.1,0.3,1,3,10,30,100]
#初始化变量
best_score = 0
best_params = {
'C':None,'gamma':None}
#TODO:寻找SVM模型最优的超参数
#STEP:遍历每一个超参数
for C in C_values:
for gamma in gamma_values:
#STEP2:调用SVM包,计算当前参数下的得分
svc = svm.SVC(C = C,gamma = gamma)
svc.fit(X,y)
score = svc.score(Xval,yval)
#STEP3:替换得分最高的超参数组合
if score > best_score:
best_score = score
best_params['C'] = C
best_params['gamma'] = gamma
best_score,best_params
实验四、构建垃圾分类器
1. 加载数据
spam_train = loadmat('spamTrain.mat')
spam_test = loadmat('spamTest.mat')
spam_train
2. 转换数据格式
#TODO:获取训练和测试数据,这里应 注意把标签y矩阵拉直
X = spam_train['X']
Xtest = spam_test['Xtest']
y = spam_train['y'].ravel()
ytest = spam_test['ytest'].ravel()
X.shape,y.shape,Xtest.shape,ytest.shape
3. 设定模型,并拟合
svc = svm.SVC()
svc.fit(X,y)
print('Training accuracy = {0}%'.format(np.round(svc.score(X,y)*100,2)))