本系列是七月算法机器学习课程笔记
学习SVM不要先看数学公式,这样把SVM的精华都丢掉了。学习SVM学习作者是如何构建出这样一个算法的过程。
1 问题
无论线性分类、逻辑回归、决策树都是要找到一个决策边界。但是这个决策边界什么时候最好呢?
就像图中这样,答案应该是线条3最好,它的泛化能力更强。那怎么找到这样的一条线呢?
2 key idea 1
目标是要找到最宽的那条街道(widest street way)。
假设这条线已经存在,可以做这条线的法向量 w ⃗ \vec{w} w,那么对于需要预测的一个点,记作向量 u x ⃗ \vec{u_x} ux,那么 u x ⃗ \vec{u_x} ux在法向量上的投影和截距b有这样一个关系:如果 u x ⃗ w ⃗ + b > = 0 \vec{u_x}\vec{w}+b>=0 uxw+b>=0,则是属于正分类。否则属于负分类。u是属于任意一个样本。
3 key idea 2
根据上面的式子,我们可以要求如下:
对于训练集中的正样本
x
+
⃗
w
⃗
+
b
>
=
1
\vec{x_+}\vec{w}+b>=1
x+w+b>=1
对于训练集中的负样本
x
−
⃗
w
⃗
+
b
<
=
−
1
\vec{x_-}\vec{w}+b<=-1
x−w+b<=−1
对于训练集中的站在街边的点取到等于号。
用
y
i
y_i
yi乘以上面的式子会发现两个条件变成一个条件了。
先看正样本,
y
i
=
1
y_i=1
yi=1,
y
i
∗
(
x
i
⃗
w
⃗
+
b
)
>
=
1
∗
1
y_i*(\vec{x_i}\vec{w}+b)>=1*1
yi∗(xiw+b)>=1∗1 得到
x
i
⃗
w
⃗
+
b
>
=
1
\vec{x_i}\vec{w}+b>=1
xiw+b>=1
再看负样本, y i = − 1 y_i=-1 yi=−1, y i ∗ ( x i ⃗ w ⃗ + b ) > = − 1 ∗ ( − 1 ) y_i*(\vec{x_i}\vec{w}+b)>=-1*(-1) yi∗(xiw+b)>=−1∗(−1),得到 y i ( x i ⃗ w ⃗ ) + b > = 1 y_i(\vec{x_i}\vec{w})+b>=1 yi(xiw)+b>=1
所以对于训练集中的每一个样本有这样一个约束:
y
i
(
x
i
⃗
w
⃗
+
b
)
>
=
1
y_i(\vec{x_i}\vec{w}+b)>=1
yi(xiw+b)>=1
站在街边的样本取到等于号。
4 key idea 3
取训练集中站在街边的一个正样本 x + ⃗ \vec{x_+} x+,一个负样本 x − ⃗ \vec{x_-} x−,可以得到一个 x + ⃗ − x − ⃗ \vec{x_+}-\vec{x_-} x+−x−(图中红色的向量)
这条街的宽度就是红色向量在法向量上的投影。
w
i
d
t
h
=
(
x
+
⃗
−
x
−
⃗
)
w
⃗
∣
w
⃗
∣
width=(\vec{x_+}-\vec{x_-})\dfrac{\vec{w}}{|\vec{w}|}
width=(x+−x−)∣w∣w
对于站点街上的正样本,因为
y
i
(
x
+
⃗
w
⃗
+
b
)
=
1
y_i(\vec{x_+}\vec{w}+b)=1
yi(x+w+b)=1,得到
x
+
⃗
w
⃗
=
1
−
b
\vec{x_+}\vec{w}=1-b
x+w=1−b
对于站点街上的负样本,因为 y i ( x − ⃗ w ⃗ + b ) = 1 y_i(\vec{x_-}\vec{w}+b)=1 yi(x−w+b)=1,得到 x − ⃗ w ⃗ = − 1 + b \vec{x_-}\vec{w}=-1+b x−w=−1+b
代入上面的式子
w
i
d
t
h
=
(
x
+
⃗
−
x
−
⃗
)
w
⃗
∣
w
⃗
∣
=
2
∣
w
⃗
∣
width=(\vec{x_+}-\vec{x_-})\dfrac{\vec{w}}{|\vec{w}|}=\dfrac{2}{|\vec{w}|}
width=(x+−x−)∣w∣w=∣w∣2
推到到这里,发现这个宽度和数据集没有关系。
要想width最大,那就应该 2 ∣ w ⃗ ∣ \dfrac{2}{|\vec{w}|} ∣w∣2最大,那么就 ∣ w ⃗ ∣ |\vec{w}| ∣w∣最小,那就 1 2 ∣ w ⃗ ∣ 2 \dfrac{1}{2}|\vec{w}|^2 21∣w∣2最小。
到现在的结论是: m i n ( 1 2 ∣ w ⃗ ∣ 2 ) min(\dfrac{1}{2}|\vec{w}|^2) min(21∣w∣2),约束条件是: y i ( x i ⃗ w ⃗ + b ) − 1 = 0 y_i(\vec{x_i}\vec{w}+b)-1=0 yi(xiw+b)−1=0
5 key idea4
现在我们知道目标是要找到最小的 ( 1 2 ∣ w ⃗ ∣ 2 ) (\dfrac{1}{2}|\vec{w}|^2) (21∣w∣2),在约束条件下: y i ( x i ⃗ w ⃗ + b ) − 1 = 0 y_i(\vec{x_i}\vec{w}+b)-1=0 yi(xiw+b)−1=0
使用拉格朗日解决: L = 1 2 ∣ w ⃗ ∣ 2 − ∑ λ i [ y i ( x i ⃗ w ⃗ + b ) − 1 ] L=\dfrac{1}{2}|\vec{w}|^2-\sum\lambda_i[y_i(\vec{x_i}\vec{w}+b)-1] L=21∣w∣2−∑λi[yi(xiw+b)−1]
在这个式子中,假设拉格朗日因子
λ
\lambda
λ已知,w和b是未知数。
首先对w求导取到极值点:
w
⃗
−
∑
λ
i
y
i
x
i
⃗
=
0
\vec{w}-\sum\lambda_iy_i\vec{x_i}=0
w−∑λiyixi=0,得到
w
⃗
=
∑
λ
i
y
i
x
i
⃗
\vec{w}=\sum\lambda_iy_i\vec{x_i}
w=∑λiyixi
其次对b求导取到极值点: ∑ λ i y i = 0 \sum\lambda_iy_i=0 ∑λiyi=0
将刚刚求得的两个式子带回到拉格朗日式子:
L
=
1
2
∣
w
⃗
∣
2
−
∑
λ
i
[
y
i
(
x
i
⃗
w
⃗
+
b
)
−
1
]
L=\dfrac{1}{2}|\vec{w}|^2-\sum\lambda_i[y_i(\vec{x_i}\vec{w}+b)-1]
L=21∣w∣2−∑λi[yi(xiw+b)−1]
= 1 2 ∑ λ i y i x i ⃗ ∑ λ j y j x j ⃗ − ∑ λ i y i x i ⃗ ∑ λ j y j x j ⃗ − ∑ λ i y i b + ∑ λ i =\dfrac{1}{2}\sum\lambda_iy_i\vec{x_i}\sum\lambda_jy_j\vec{x_j}-\sum\lambda_iy_i\vec{x_i}\sum\lambda_jy_j\vec{x_j}-\sum\lambda_iy_ib+\sum\lambda_i =21∑λiyixi∑λjyjxj−∑λiyixi∑λjyjxj−∑λiyib+∑λi
= 1 2 ∑ λ i y i x i ⃗ ∑ λ j y j x j ⃗ − ∑ λ i y i x i ⃗ ∑ λ j y j x j ⃗ + ∑ λ i =\dfrac{1}{2}\sum\lambda_iy_i\vec{x_i}\sum\lambda_jy_j\vec{x_j}-\sum\lambda_iy_i\vec{x_i}\sum\lambda_jy_j\vec{x_j}+\sum\lambda_i =21∑λiyixi∑λjyjxj−∑λiyixi∑λjyjxj+∑λi
= ∑ λ i − 1 2 ∑ λ i y i x i ⃗ ∑ λ j y j x j ⃗ =\sum\lambda_i-\dfrac{1}{2}\sum\lambda_iy_i\vec{x_i}\sum\lambda_jy_j\vec{x_j} =∑λi−21∑λiyixi∑λjyjxj
= ∑ λ i − 1 2 ∑ ∑ λ i λ j y i y j ( x i ⃗ x j ⃗ ) =\sum\lambda_i-\dfrac{1}{2}\sum\sum\lambda_i\lambda_jy_iy_j(\vec{x_i}\vec{x_j}) =∑λi−21∑∑λiλjyiyj(xixj)
可以看到L取决于两个样本的乘积: x i ⃗ x j ⃗ \vec{x_i}\vec{x_j} xixj
6 拉格朗日乘子求解
拉格朗日乘子: λ i \lambda_i λi可以使用SMO、KTT、QP来求解。在求解过程中每次以其中两个数 λ i \lambda_i λi, λ j \lambda_j λj为未知数进行求导,求得下一轮的值。因为如果只以一个为未知数: λ i \lambda_i λi那么会存在另外一个 λ j \lambda_j λj和它是线性关系,不能求解。
7 核函数的发现
用来预测的函数:如果
w
⃗
u
⃗
+
b
>
=
0
\vec{w}\vec{u}+b>=0
wu+b>=0,则是属于正分类。
∑
λ
i
y
i
x
i
⃗
u
⃗
+
b
>
=
0
\sum\lambda_iy_i\vec{x_i}\vec{u}+b>=0
∑λiyixiu+b>=0
∑ λ i y i ( x i ⃗ u ⃗ ) + b > = 0 \sum\lambda_iy_i(\vec{x_i}\vec{u})+b>=0 ∑λiyi(xiu)+b>=0
x i ⃗ u ⃗ \vec{x_i}\vec{u} xiu是向量的点乘,表示一个线性关系。如果样本线性不可分,怎么办?一种方法是将每个点升级到高维空间。让它们在高维空间线性可分。发现找不到这样的线性函数。上面的式子告诉我们,不用找到每个点的高维空间,只要找到两个点点乘的高维空间即可。也就是说 K ( x i , x j ) = Θ ( x i ) Θ ( x j ) K(x_i,x_j)=\varTheta(x_i)\varTheta(x_j) K(xi,xj)=Θ(xi)Θ(xj)
常用的核函数有:
线性核函数:
K
(
x
i
,
x
j
)
=
x
i
T
x
j
K(x_i,x_j)=x_i^Tx_j
K(xi,xj)=xiTxj
多项式核函数:
K
(
x
i
,
x
j
)
=
(
λ
x
i
T
x
j
+
r
)
d
K(x_i,x_j)=(\lambda x_i^Tx_j+r)^d
K(xi,xj)=(λxiTxj+r)d
RBF:
K
(
x
i
,
x
j
)
=
e
1
λ
∣
x
i
−
x
j
∣
2
K(x_i,x_j)=e^{\dfrac{1}{\lambda|x_i-x_j|^2}}
K(xi,xj)=eλ∣xi−xj∣21
sigmoid函数: K ( x i , x j ) = t a n h ( λ x i T x j + r ) K(x_i,x_j)=tanh(\lambda x_i^Tx_j+r) K(xi,xj)=tanh(λxiTxj+r)