前言
感知机是《统计学习方法》介绍的第一个算法,它解决的也是最基本的问题,即,面对已经标记的数据,如何根据标记将它们区分开来。
本文将从感知机问题的来源、感知机推导以及感知机的python3代码实现来展开。
1、问题的来源
为什么需要感知机?举个相亲的例子。
- 你相亲了四个男性,分别为A,B,C,D;
- 每个男性,从身高和颜值这两个特征进行刻画,身高以米为单位,颜值从0到1打分;
- 这四个男性的数据为A(1.80,0.6),B(1.76, 0.9),C(1.5, 0.4),D(1.4, 0.7);
- 这四个男性分别被你标记为 理想(+1),理想(+1),失望(-1),失望(-1)。
将上面的数据展示出来,如下
如果你又收到一个相亲邀约,且对方已经将 颜值-身高 数据 E(1.7, 0.8)发给你,如图1,那么,你将
- 如何基于经验,也就是上述四个男性的数据
- 决定是否开始新的相亲(如果理想则相亲,否则不相亲)?
2. 问题的抽象
我们有N个数据, x 1 x_1 x1, x 2 x_2 x2,…, x N x_N xN,它们的标记分别为 y 1 y_1 y1, y 2 y_2 y2,…, y N y_N yN。其中, x i ∈ R n x_i\in\mathbb{R}^n xi∈Rn, y i ∈ { + 1 , − 1 } y_i\in\{+1, -1\} yi∈{+1,−1}.
类似于相亲问题,当遇到一个新的数据 x N + 1 x_{N+1} xN+1,如何给它标记,或者说, y N + 1 = ? y_{N+1}=? yN+1=?。
3. 问题的简单化
我们对数据集提出要求,即,要求数据集是线性可分的。
- 直观上说,线性可分的数据集是如图2所示的,总是有一条直线可以将其划分。
而对另一些数据,如图3所示,则是不可分的,因为找不到这样一条直线,使得它能够分开数据集。
- 线性可分数据集的数学定义。
考虑数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
N
,
y
N
)
}
T=\{(x_1, y_1), (x_2, y_2), ..., (x_N, y_N)\}
T={(x1,y1),(x2,y2),...,(xN,yN)}
其中,
x
i
∈
R
n
x_i\in\mathbb{R}^n
xi∈Rn,
y
i
∈
{
+
1
,
−
1
}
y_i\in\{+1, -1\}
yi∈{+1,−1}。
在特征空间
R
n
\mathbb{R}^n
Rn里面,如果存在一个超平面
w
⋅
x
+
b
=
0
w\cdot x+b=0
w⋅x+b=0
使得不等式
y
i
(
w
⋅
x
i
+
b
)
>
0
y_i(w\cdot x_i+b)>0
yi(w⋅xi+b)>0 恒成立,则称该数据集
T
T
T是线性可分的,否则,数据集
T
T
T线性不可分。
- 线性可分数据集的解释。
根据定义,线性可分的数据集,总是存在一个超平面 w ⋅ x + b = 0 w\cdot x+b=0 w⋅x+b=0,使得对于标记为+1,也就是 y i = + 1 y_i=+1 yi=+1的数据,有 w ⋅ x i + b > 0 w\cdot x_i+b>0 w⋅xi+b>0;对于标记为-1,也就是 y i = − 1 y_i=-1 yi=−1的数据,有 w ⋅ x i + b < 0 w\cdot x_i+b<0 w⋅xi+b<0。
这里,超平面 w ⋅ x + b = 0 w\cdot x+b=0 w⋅x+b=0 其实对应着图2中的那条直线。
4. 问题的求解
对于线性可分数据集而言,显然我们需要找到一个特征空间
R
n
\mathbb{R}^n
Rn 中的超平面
w
⋅
x
+
b
=
0
w\cdot x+b=0
w⋅x+b=0,使得
y
=
f
(
x
)
=
s
i
g
n
(
w
⋅
x
+
b
)
y=f(x)=sign(w\cdot x+b)
y=f(x)=sign(w⋅x+b)
对数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
N
,
y
N
)
}
T=\{(x_1, y_1), (x_2, y_2), ..., (x_N, y_N)\}
T={(x1,y1),(x2,y2),...,(xN,yN)} 恒成立。
这样,当来到一个新的数据 x N + 1 x_{N+1} xN+1时,它的标记可以令为 y N + 1 = f ( x N + 1 ) y_{N+1}=f(x_{N+1}) yN+1=f(xN+1)。
4.1 损失函数
在进行具体的求解之前,我们当然期望模型
f
(
x
)
=
s
i
g
n
(
w
⋅
x
+
b
)
f(x)=sign(w\cdot x+b)
f(x)=sign(w⋅x+b)
对于数据集
T
T
T 越准确越好,也就是说,希望误分类点越少越好。如果没有误分类点,那么这个模型就是我们要求的。
对于误分类点 ( x i , y i ) (x_i, y_i) (xi,yi),模型 y = f ( x i ) y=f(x_i) y=f(xi)得到的标记与实际标记 y i y_i yi符号相反,即, y i ( w ⋅ x i + b ) < 0 y_i(w\cdot x_i+b)<0 yi(w⋅xi+b)<0。
记误分类点集合为
M
M
M,自然的,我们选取如下函数作为目标函数,
min
w
,
b
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
(
w
⋅
x
i
+
b
)
\min\limits_{w, b} L(w, b)=-\sum\limits_{x_i\in M}y_i(w\cdot x_i+b)
w,bminL(w,b)=−xi∈M∑yi(w⋅xi+b)
显然,如果集合 M M M 非空,则 L ( w , b ) > 0 L(w, b)>0 L(w,b)>0恒成立。当我们能够求得一组 ( w , b ) (w, b) (w,b) 使得 L ( w , b ) = 0 L(w, b)=0 L(w,b)=0,此时已经没有误分类点,也就是我们要求的结果。
4.2 梯度下降
面对目标函数或者损失函数
min
w
,
b
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
(
w
⋅
x
i
+
b
)
\min\limits_{w, b} L(w, b)=-\sum\limits_{x_i\in M}y_i(w\cdot x_i+b)
w,bminL(w,b)=−xi∈M∑yi(w⋅xi+b)
我们可以用梯度下降方法进行求解。对函数
L
(
w
,
b
)
L(w, b)
L(w,b) 分别对
w
w
w 和
b
b
b 求偏导,有
∇
w
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
x
i
\nabla_{w}L(w, b)=-\sum\limits_{x_i\in M}y_ix_i
∇wL(w,b)=−xi∈M∑yixi
∇ b L ( w , b ) = − ∑ x i ∈ M y i \nabla_{b}L(w, b)=-\sum\limits_{x_i\in M}y_i ∇bL(w,b)=−xi∈M∑yi
显然,每次更新 ( w , b ) (w, b) (w,b) 之后,误分类集 M M M 就会发生变化,因此,为了减少计算,我们可以随机选择一个误分类点 ( x i , y i ) ∈ M (x_i, y_i)\in M (xi,yi)∈M 进行更新。
并且,梯度方向是函数增加最快的方向,因此,要取最小,我们只需要取梯度的反方向即可。
w
←
w
+
η
y
i
x
i
w\leftarrow w+\eta y_ix_i
w←w+ηyixi
b ← b + η y i b\leftarrow b+\eta y_i b←b+ηyi
这里,
η
\eta
η为学习步长。步长过小,会造成算法时间过长;步长过大,可能会导致震荡而无法达到最优值。如图4,图5所示。
5. 感知机算法
通过上面的讨论,我们知道如何更新 ( w , b ) (w, b) (w,b),以及何时停止算法。
现将算法总结如下:
- 步骤一:任意挑选初值 w 0 w_0 w0 和 b 0 b_0 b0;
- 步骤二:遍历整个数据集 T T T,找出第一个误分类点 ( x i , y i ) (x_i, y_i) (xi,yi);
- 步骤三:更新 w w w 和 b b b,如下 w ← w + η y i x i w\leftarrow w+\eta y_i x_i w←w+ηyixi b ← b + η y i b\leftarrow b+\eta y_i b←b+ηyi
- 步骤四:返回步骤二,当找不到误分类点时,终结算法
下面证明上述算法,在给定数据集 T T T 的情况下,总是可以在有限步内获得解 ( w o p t , b o p t ) (w_{opt}, b_{opt}) (wopt,bopt)。
记第k次更新后,参数为 ( w k , b k ) (w_k, b_k) (wk,bk)。我们令初始值 ( w 0 , b 0 ) = ( 0 , 0 ) (w_0, b_0)=(0, 0) (w0,b0)=(0,0)。
我们的证明分为三个步骤:
- 证明
∥
(
w
k
,
b
k
)
∥
2
≤
k
η
2
R
2
\left\|(w_k, b_k)\right\|^2\le k\eta^2R^2
∥(wk,bk)∥2≤kη2R2。实际上,
∥ ( w k , b k ) ∥ 2 = ∥ ( w k − 1 + η y i x i , b k − 1 + η y i ) ∥ 2 = ∥ ( w k − 1 , b k − 1 ) + η y i ( x i , 1 ) ∥ 2 ≤ ∥ ( w k − 1 , b k − 1 ) ∥ 2 + 2 η y i ( w k − 1 , b k − 1 ) ⋅ ( x i , 1 ) + ∥ η y i ( x i , 1 ) ∥ 2 \begin{array}{lll} \left\|(w_k, b_k)\right\|^2 &=& \left\|(w_{k-1}+\eta y_i x_i, b_{k-1}+\eta y_i)\right\|^2\\ &=& \left\| (w_{k-1}, b_{k-1})+ \eta y_i( x_i,1) \right\|^2\\ &\le&\left\|(w_{k-1}, b_{k-1})\right\|^2 +2\eta y_i(w_{k-1}, b_{k-1})\cdot( x_i,1)+ \left\|\eta y_i( x_i,1) \right\|^2 \end{array} ∥(wk,bk)∥2==≤∥(wk−1+ηyixi,bk−1+ηyi)∥2∥(wk−1,bk−1)+ηyi(xi,1)∥2∥(wk−1,bk−1)∥2+2ηyi(wk−1,bk−1)⋅(xi,1)+∥ηyi(xi,1)∥2
由于 ( x i , y i ) (x_i, y_i) (xi,yi)是第k次更新时发现的误分类点,所以满足 y i ( w k − 1 , b k − 1 ) ⋅ ( x i , 1 ) ≤ 0 y_i(w_{k-1}, b_{k-1})\cdot( x_i,1)\le 0 yi(wk−1,bk−1)⋅(xi,1)≤0
所以可以得到,
∥
(
w
k
,
b
k
)
∥
2
≤
∥
(
w
k
−
1
,
b
k
−
1
)
∥
2
+
∥
η
y
i
(
x
i
,
1
)
∥
2
≤
∥
(
w
k
−
1
,
b
k
−
1
)
∥
2
+
η
2
R
2
\begin{array}{lll} \left\|(w_k, b_k)\right\|^2&\le&\left\|(w_{k-1}, b_{k-1})\right\|^2+\left\|\eta y_i( x_i,1) \right\|^2 \\ &\le&\left\|(w_{k-1}, b_{k-1})\right\|^2+\eta^2R^2 \end{array}
∥(wk,bk)∥2≤≤∥(wk−1,bk−1)∥2+∥ηyi(xi,1)∥2∥(wk−1,bk−1)∥2+η2R2
其中, R = max ( x i , y i ) ∈ T ∥ ( x i , 1 ) ∥ R=\max\limits_{(x_i, y_i)\in T}\left\|( x_i,1) \right\| R=(xi,yi)∈Tmax∥(xi,1)∥。
对上式进行递归,考虑到
(
w
0
,
b
0
)
=
(
0
,
0
)
(w_0, b_0)=(0, 0)
(w0,b0)=(0,0),可以得到
∥
(
w
k
,
b
k
)
∥
2
≤
k
η
2
R
2
\left\|(w_k, b_k)\right\|^2\le k\eta^2R^2
∥(wk,bk)∥2≤kη2R2
2. 证明
(
w
k
,
b
k
)
⋅
(
w
o
p
t
,
b
o
p
t
)
≥
k
η
γ
(w_k, b_k)\cdot(w_{opt}, b_{opt})\ge k\eta\gamma
(wk,bk)⋅(wopt,bopt)≥kηγ。实际上,
(
w
k
,
b
k
)
⋅
(
w
o
p
t
,
b
o
p
t
)
=
(
w
k
−
1
+
η
y
i
x
i
,
b
k
−
1
+
η
y
i
)
⋅
(
w
o
p
t
,
b
o
p
t
)
=
w
k
−
1
⋅
w
o
p
t
+
b
k
−
1
b
o
p
t
+
η
y
i
(
w
o
p
t
⋅
x
i
+
b
o
p
t
)
=
(
w
k
−
1
,
b
k
−
1
)
⋅
(
w
o
p
t
,
b
o
p
t
)
+
η
y
i
(
w
o
p
t
⋅
x
i
+
b
o
p
t
)
≥
(
w
k
−
1
,
b
k
−
1
)
⋅
(
w
o
p
t
,
b
o
p
t
)
+
η
γ
\begin{array}{lll} (w_k, b_k)\cdot(w_{opt}, b_{opt}) &=& (w_{k-1}+\eta y_i x_i, b_{k-1}+\eta y_i)\cdot(w_{opt}, b_{opt})\\ &=& w_{k-1}\cdot w_{opt}+ b_{k-1}b_{opt} + \eta y_i(w_{opt}\cdot x_i+b_{opt}) \\ &=& (w_{k-1}, b_{k-1})\cdot(w_{opt}, b_{opt}) + \eta y_i(w_{opt}\cdot x_i+b_{opt}) \\ &\ge&(w_{k-1}, b_{k-1})\cdot(w_{opt}, b_{opt}) + \eta \gamma \end{array}
(wk,bk)⋅(wopt,bopt)===≥(wk−1+ηyixi,bk−1+ηyi)⋅(wopt,bopt)wk−1⋅wopt+bk−1bopt+ηyi(wopt⋅xi+bopt)(wk−1,bk−1)⋅(wopt,bopt)+ηyi(wopt⋅xi+bopt)(wk−1,bk−1)⋅(wopt,bopt)+ηγ
其中, γ = min ( x i , y i ) ∈ T y i ( w o p t ⋅ x i + b o p t ) \gamma=\min\limits_{(x_i, y_i)\in T}y_i(w_{opt}\cdot x_i+b_{opt}) γ=(xi,yi)∈Tminyi(wopt⋅xi+bopt)。
通过递归,考虑到
(
w
0
,
b
0
)
=
(
0
,
0
)
(w_0,b_0)=(0, 0)
(w0,b0)=(0,0),我们有
(
w
k
,
b
k
)
⋅
(
w
o
p
t
,
b
o
p
t
)
≥
k
η
γ
(w_k, b_k)\cdot(w_{opt}, b_{opt})\ge k\eta\gamma
(wk,bk)⋅(wopt,bopt)≥kηγ
3. 证明更新次数
k
k
k 满足
k
≤
(
R
γ
)
2
k\le\left(\frac{R}{\gamma}\right)^2
k≤(γR)2。根据第一步和第二步得到的两个不等式,我们有
k
η
γ
≤
(
w
k
,
b
k
)
⋅
(
w
o
p
t
,
b
o
p
t
)
≤
∥
(
w
k
,
b
k
)
∥
⋅
∥
(
w
o
p
t
,
b
o
p
t
)
∥
=
∥
(
w
k
,
b
k
)
∥
≤
k
η
R
\begin{array}{lll} k\eta\gamma&\le& (w_k, b_k)\cdot(w_{opt}, b_{opt})\\ &\le&\left\|(w_k, b_k)\right\|\cdot\left\|(w_{opt}, b_{opt})\right\|\\ &=&\left\|(w_k, b_k)\right\|\\ &\le&\sqrt{k} \eta R \end{array}
kηγ≤≤=≤(wk,bk)⋅(wopt,bopt)∥(wk,bk)∥⋅∥(wopt,bopt)∥∥(wk,bk)∥kηR
通过简单化简,可以得到 k ≤ ( R γ ) 2 k\le\left(\frac{R}{\gamma}\right)^2 k≤(γR)2。
这里的等式之所以成立,是因为我们可以选取
(
w
o
p
t
,
b
o
p
t
)
(w_{opt}, b_{opt})
(wopt,bopt) 使得
∥
(
w
o
p
t
,
b
o
p
t
)
∥
=
1
\left\|(w_{opt}, b_{opt})\right\|=1
∥(wopt,bopt)∥=1。这样的选取是简单的。考虑超平面
w
o
p
t
⋅
x
+
b
o
p
t
=
0
w_{opt}\cdot x + b_{opt}=0
wopt⋅x+bopt=0
由于对 w o p t w_{opt} wopt 和 b o p t b_{opt} bopt 同时乘除一个数,超平面并不变,因此,我们可以同时乘以 1 ∥ ( w o p t , b o p t ) ∥ \frac{1}{\left\|(w_{opt}, b_{opt})\right\|} ∥(wopt,bopt)∥1,此时,新的参数 ( w o p t ∥ ( w o p t , b o p t ) ∥ , b o p t ∥ ( w o p t , b o p t ) ∥ ) (\frac{w_{opt}}{\left\|(w_{opt}, b_{opt})\right\|}, \frac{b_{opt}}{\left\|(w_{opt}, b_{opt})\right\|}) (∥(wopt,bopt)∥wopt,∥(wopt,bopt)∥bopt) 满足 ∥ ( w o p t ∥ ( w o p t , b o p t ) ∥ , b o p t ∥ ( w o p t , b o p t ) ∥ ) ∥ = 1 \left\|(\frac{w_{opt}}{\left\|(w_{opt}, b_{opt})\right\|}, \frac{b_{opt}}{\left\|(w_{opt}, b_{opt})\right\|})\right\|=1 ∥∥∥∥(∥(wopt,bopt)∥wopt,∥(wopt,bopt)∥bopt)∥∥∥∥=1
证毕。
在下一篇博客,我们将继续介绍感知机算法的对偶形式,以及python3代码实现。