李航统计学习方法——感知机
1.数据集的线性可分性
给定一个数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
…
,
(
x
N
,
y
N
)
}
T=\{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\}
T={(x1,y1),(x2,y2),…,(xN,yN)}
其中
x
i
∈
χ
=
R
n
,
y
i
∈
Y
=
{
+
1
,
−
1
}
,
i
=
1
,
2
,
…
,
N
,
如
果
存
在
某
个
超
平
面
S
:
w
∗
x
+
b
=
0
x_i\in\chi=R^n,y_i\in\mathcal{Y}=\{+1,-1\},i=1,2,\dots,N,如果存在某个超平面S:w*x+b=0
xi∈χ=Rn,yi∈Y={+1,−1},i=1,2,…,N,如果存在某个超平面S:w∗x+b=0
能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,及对所有的
y_i=+1的实例i,有w*x_i+b>0
y_i=-1的实例i,有w*x_i+b<0
则称数据集T为线性可分数据集
2.感知机学习策略
假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。即需要我们去确定感知机模型参数w,b,我们需要确定一个学习策略,即定义(经验)损失函数并将损失函数极小化。
损失函数的一个自然选择是误分类点的总数,但这样的损失函数不会死参数w,b的连续可导函数,不易优化。
感知机采用误分类点到超平面S的总距离。为此,首先有输入空间R^n中任一点x_0,到超平面S的距离
1
∣
∣
w
∣
∣
∣
w
∗
x
0
+
b
∣
,
∣
∣
w
∣
∣
是
w
的
L
2
范
数
\frac{1}{||w||}|w*x_0+b|,||w||是w的L_2范数
∣∣w∣∣1∣w∗x0+b∣,∣∣w∣∣是w的L2范数
对于误分类的数据(x_i,y_i)有
−
y
i
(
w
∗
x
i
+
b
)
>
0
-y_i(w*x_i+b)>0
−yi(w∗xi+b)>0
因为当
w
∗
x
i
+
b
>
0
时
,
y
i
=
−
1
(
把
+
1
认
成
了
−
1
)
w
∗
x
i
+
b
<
0
时
,
y
i
=
+
1
(
把
−
1
认
成
了
+
1
)
w*x_i+b>0时,y_i=-1(把+1认成了-1) \\ w*x_i+b<0时,y_i=+1(把-1认成了+1)
w∗xi+b>0时,yi=−1(把+1认成了−1)w∗xi+b<0时,yi=+1(把−1认成了+1)
此时我们能得到误分类点的x_i到超平面S的距离:
−
1
∣
∣
w
∣
∣
y
i
(
w
∗
x
i
+
b
)
-\frac{1}{||w||}y_i(w*x_i+b)
−∣∣w∣∣1yi(w∗xi+b)
假定超平面S的误分类点集合为M,那所有的误分类点到超平面S的总距离为:
−
1
∣
∣
w
∣
∣
∑
x
i
∈
M
y
i
(
w
∗
x
i
+
b
)
-\frac{1}{||w||}\sum_{x_i\in M}y_i(w*x_i+b)
−∣∣w∣∣1xi∈M∑yi(w∗xi+b)
不考虑1/||w||,我们就得到感知机学习的损失函数
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
(
w
∗
x
i
+
b
)
L(w,b)=-\sum_{x_i\in M}y_i(w*x_i+b)
L(w,b)=−xi∈M∑yi(w∗xi+b)
- 损失函数L(w,b)是非负的
- 没有误分类点,损失函数值是0
- 误分类点越少,误分类点离超平面越近,损失函数值越小
- 损失函数L(w,b)是参数w,b的线性(连续可导)函数
3.感知机学习算法
3.1感知机学习算法原始形式
min w , b L ( w , b ) = − ∑ x i ∈ M y i ( w ∗ x i + b ) , M 为 误 分 类 点 的 集 合 \min_{w,b}L(w,b)=-\sum_{x_i\in M}y_i(w*x_i+b),M为误分类点的集合 w,bminL(w,b)=−xi∈M∑yi(w∗xi+b),M为误分类点的集合
感知机学习算法是误分类驱动的,具体采用随机梯度下降法。
首先,任意选取一个超平面w_0,b_0,然后利用梯度下降法不断的极小化目标函数。
极小化过程不是一次使M中所有误分类点的梯度下降,而是每次随机选取一个误分类点使其梯度下降
▽
w
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
x
i
▽
b
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
\bigtriangledown_wL(w,b)=-\sum_{x_i\in M}y_ix_i \\ \bigtriangledown_bL(w,b)=-\sum_{x_i\in M}y_i
▽wL(w,b)=−xi∈M∑yixi▽bL(w,b)=−xi∈M∑yi
随机选取一个误分类点(x_i,y_i),对w,b进行更新:
w
←
w
+
η
y
i
x
i
b
←
b
+
η
y
i
w\leftarrow w+\eta y_ix_i \\ b\leftarrow b + \eta y_i
w←w+ηyixib←b+ηyi
其中η(0<η≤1)是步长,在统计学习中又称为学习率。此时通过迭代可使损失函数L(w,b)不断减小,直到为0.综上所述,有如下算法:
import numpy as np
def Perceptron(x,y,w,b,eta):
m,n = x.shape
bool = True
while bool:
bool = False
for i in range(m):
if y[i]*(w.dot(x[i])+b) <= 0:
w = w + eta*y[i]*x[i]
b = b + eta*y[i]
# print(w,b)
bool = True
break
return w,b
# 设置初始值
x = np.array([[3,3],[4,3],[1,1]])
y = np.array([1,1,-1])
m,n = x.shape
w = np.zeros(n)
b = 0
eta = 1 # 学习率
w,b = Perceptron(x, y, w, b, eta)
3.2感知机学习算法的对偶形式
def Perceptron_dual(x,y,nn,eta):
m,n = x.shape
Gram = np.zeros((m,m))
for i in range(m):
for j in range(m):
Gram[i][j] = x[i].dot(x[j])
bool = True
while bool:
bool = False
for i in range(m):
data = 0
for j in range(m):
data = data + nn[j]*eta*y[j]*Gram[i][j]+nn[j]*eta*y[j]
if y[i]*(data) <= 0:
nn[i] = nn[i]+1
bool = True
break
return nn
# 设置初始值
x = np.array([[3,3],[4,3],[1,1]])
y = np.array([1,1,-1])
m,n = x.shape
nn = np.zeros(m)
eta = 1 # 学习率
nn = Perceptron_dual(x, y, nn, eta)
print(nn)