一切为了数据挖掘的准备
2.感知机
2.1感知机模型
- 感知机:二类分类的线性模型。
- 数学表达:输入空间 X ⊆ R n X\subseteq R^n X⊆Rn,输出空间是 y = { + 1 , − 1 } y=\{+1,-1\} y={+1,−1},输入实例x,输出实例y,输入空间到输出空间的函数: f ( x ) = s i g n ( w x + b ) f(x) = sign(wx+b) f(x)=sign(wx+b), w ∈ R n w \in R^n w∈Rn,叫做权值, b ∈ R b\in R b∈R叫做偏置。sign函数是符号函数 s i g n ( x ) = { + 1 , x ⩾ 0 − 1 , x < 0 sign(x)=\begin{cases} +1, & x\geqslant 0 \\ -1, & x <0 \end{cases} sign(x)={+1,−1,x⩾0x<0
- 分离超平面S: w x + b = 0 wx+b=0 wx+b=0对应一个超平面S,w是超平面的法向量,b是超平面的截距,可以将样本点分为正、负两类。
- 对于数据集T,对所有的 y i = + 1 y_i = +1 yi=+1的实例, w x i + b > 0 wx_i+b>0 wxi+b>0; y i = − 1 y_i = -1 yi=−1的实例, w x i + b < 0 wx_i+b<0 wxi+b<0,则数据集T为线性可分数据集。
2.2感知机学习策略
- 输入空间 R n R^n Rn中任一点 x 0 x_0 x0到超平面S的距离: 1 ∣ ∣ w ∣ ∣ ∣ w x 0 + b ∣ \frac{1}{||w||}|wx_0+b| ∣∣w∣∣1∣wx0+b∣, ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣是w的 L 2 L_2 L2范数
- 如果数据正确分类 y i ( w x i + b ) > 0 y_i(wx_i+b)>0 yi(wxi+b)>0,如果被误分类 y i ( w x i + b ) < 0 y_i(wx_i+b)<0 yi(wxi+b)<0,误分类点到超平面S的距离 − 1 ∣ ∣ w ∣ ∣ y i ( w x i + b ) -\frac{1}{||w||}y_i(wx_i+b) −∣∣w∣∣1yi(wxi+b)
- 损失函数: L ( w x + b ) = − ∑ x i ∈ M y i ( w x i + b ) L(wx+b)=-\sum_{x_i \in M}y_i(wx_i+b) L(wx+b)=−∑xi∈Myi(wxi+b),M为误分类的点。这个损失函数就是感知机的经验风险函数。
2.3感知机学习算法
感知机学习算法的原始形式
-
损失函数极小化: m i n L ( w x + b ) = − ∑ x i ∈ M y i ( w x i + b ) minL(wx+b)=-\sum_{x_i \in M}y_i(wx_i+b) minL(wx+b)=−∑xi∈Myi(wxi+b)
-
梯度下降:
∇ w L ( w , b ) = − ∑ x i ∈ M y i x i \nabla_wL(w,b)=-\sum_{x_i \in M}y_ix_i ∇wL(w,b)=−xi∈M∑yixi
∇ b L ( w , b ) = − ∑ x i ∈ M y i \nabla_bL(w,b)=-\sum_{x_i \in M}y_i ∇bL(w,b)=−xi∈M∑yi
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 -
算法过程
- 选取初值 w 0 , b 0 w_0,b_0 w0,b0
- 在训练集中选取数据 ( x i , y i ) (x_i,y_i) (xi,yi)
- 如果 y i ( w x i + b ) ⩽ 0 y_i(wx_i+b)\leqslant 0 yi(wxi+b)⩽0, 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+ηyixi,b←b+ηyi,直至此点被正确分类
- 转至第二步,直至训练集中没有误分类点
感知机学习算法的对偶形式
将最后学习到的w,b表示为 w = ∑ i = 1 N α i y i x i , b = ∑ i = 1 N α i y i w=\sum_{i=1}^{N}\alpha_iy_ix_i,b=\sum_{i=1}^N\alpha_iy_i w=∑i=1Nαiyixi,b=∑i=1Nαiyi, α i > 0 \alpha_i>0 αi>0,N为样本量
- 算法过程:感知机模型
f
(
x
)
=
s
i
g
n
(
∑
j
=
i
N
α
j
y
j
x
j
x
+
b
)
f(x)=sign(\sum_{j=i}^N \alpha_j y_jx_jx+b)
f(x)=sign(∑j=iNαjyjxjx+b),其中
α
=
(
α
1
,
α
2
,
⋯
,
α
N
)
T
\alpha=(\alpha_1,\alpha_2,\cdots,\alpha_N)^T
α=(α1,α2,⋯,αN)T
- α ← 0 , b ← 0 \alpha \leftarrow 0,b \leftarrow 0 α←0,b←0
- 训练集中选数据 ( x i , y i ) (x_i,y_i) (xi,yi)
- 如果 y i ∑ j = i N α j y j x j x i + b ⩽ 0 y_i\sum_{j=i}^N \alpha_j y_jx_jx_i+b\leqslant 0 yi∑j=iNαjyjxjxi+b⩽0, α i ← α i + η , b ← b + η y i \alpha_i \leftarrow \alpha_i + \eta ,b \leftarrow b + \eta y_i αi←αi+η,b←b+ηyi
2.4感知机学习算法收敛证明
设最后线性可分数据集学习的结果为 w ^ o p t ⋅ x ^ = w o p t ⋅ x + b o p t = 0 \hat{w}_{opt}\cdot \hat{x} = w_{opt}\cdot x+b_{opt}=0 w^opt⋅x^=wopt⋅x+bopt=0, ∣ ∣ w ^ o p t ∣ ∣ = 1 ||\hat{w}_{opt}||=1 ∣∣w^opt∣∣=1.
- 存在 γ \gamma γ,对数据集中所有数据,满足 y i ( w ^ o p t ⋅ x ^ i ) = w o p t ⋅ x i + b o p t ⩾ γ y_i(\hat{w}_{opt}\cdot \hat{x}_i )= w_{opt}\cdot x_i+b_{opt}\geqslant \gamma yi(w^opt⋅x^i)=wopt⋅xi+bopt⩾γ,即 γ \gamma γ为离超平面最近的点的距离。
- 假设第k次学习后的学习结果能将数据集完全正确的分开。
w ^ k − 1 = ( w k − 1 T , b k − 1 ) T \hat{w}_{k-1}=(w_{k-1}^T,b_{k-1})^T w^k−1=(wk−1T,bk−1)T
w k ← w k − 1 + η y i x i , w_k \leftarrow w_{k-1} + \eta y_ix_i, wk←wk−1+ηyixi,
b k ← b k − 1 + η y i , b_{k} \leftarrow b_{k-1} + \eta y_i, bk←bk−1+ηyi,
w ^ k = w ^ k − 1 + η y i x ^ i \hat{w}_k=\hat{w}_{k-1} + \eta y_i\hat{x}_i w^k=w^k−1+ηyix^i
w ^ k ⋅ w ^ o p t = w ^ k − 1 ⋅ w ^ o p t + η y i w ^ o p t x ^ i ⩾ w ^ k − 1 ⋅ w ^ o p t + η γ ⩾ w ^ o ⋅ w ^ o p t + k η γ \hat{w}_k\cdot \hat{w}_{opt} = \hat{w}_{k-1} \cdot \hat{w}_{opt} + \eta y_i\hat{w}_{opt}\hat{x}_i \geqslant \hat{w}_{k-1} \cdot \hat{w}_{opt}+\eta \gamma\geqslant \hat{w}_{o} \cdot \hat{w}_{opt}+k\eta \gamma w^k⋅w^opt=w^k−1⋅w^opt+ηyiw^optx^i⩾w^k−1⋅w^opt+ηγ⩾w^o⋅w^opt+kηγ
∣ ∣ w ^ k ∣ ∣ 2 = ∣ ∣ w ^ k − 1 + η y i x ^ i ∣ ∣ 2 = ∣ ∣ w ^ k − 1 ∣ ∣ 2 + 2 η y i w ^ k − 1 x ^ i + η 2 ∣ ∣ x ^ i ∣ ∣ 2 ⩽ ∣ ∣ w ^ k − 1 ∣ ∣ 2 + η 2 R 2 ⩽ ∣ ∣ w ^ 0 ∣ ∣ 2 + k η 2 R 2 ||\hat{w}_k||^2=||\hat{w}_{k-1} + \eta y_i\hat{x}_i||^2=||\hat{w}_{k-1}||^2 + 2\eta y_i \hat{w}_{k-1}\hat{x}_i + \eta^2||\hat{x}_i||^2 \leqslant||\hat{w}_{k-1}||^2+\eta^2R^2 \leqslant||\hat{w}_{0}||^2+k\eta^2R^2 ∣∣w^k∣∣2=∣∣w^k−1+ηyix^i∣∣2=∣∣w^k−1∣∣2+2ηyiw^k−1x^i+η2∣∣x^i∣∣2⩽∣∣w^k−1∣∣2+η2R2⩽∣∣w^0∣∣2+kη2R2
k η γ ⩽ w ^ k ⋅ w ^ o p t ⩽ ∣ ∣ w ^ k ∣ ∣ ∣ ∣ w ^ o p t ∣ ∣ ⩽ ∣ ∣ w ^ k ∣ ∣ 2 ⩽ k η R k\eta \gamma\leqslant \hat{w}_k\cdot \hat{w}_{opt} \leqslant ||\hat{w}_k||||\hat{w}_{opt}|| \leqslant ||\hat{w}_k||^2 \leqslant \sqrt{k}\eta R kηγ⩽w^k⋅w^opt⩽∣∣w^k∣∣∣∣w^opt∣∣⩽∣∣w^k∣∣2⩽kηR
k ⩽ ( R γ ) 2 k\leqslant(\frac{R}{\gamma})^2 k⩽(γR)2
2.5 我的实现,不一定简便
import numpy as np
class Perception:
def __init__(self,x,y):
self.tdx = np.array(x)
self.tdy = np.array(y)
self.w = np.zeros(self.tdx[0].shape)
self.b = 0
def train(self):
n = 0
#当存在分类错误的数据时,计算
while np.sum((np.dot(self.tdx,self.w)+self.b)*self.tdy<=0)>0:
for xi,yi in zip(self.tdx,self.tdy):
#当此数据计算错误时,更新
while yi*(np.dot(xi,self.w)+self.b)<= 0:
self.w += yi*xi
self.b += yi
n += 1
print('w:',self.w,' b:',self.b,' 第%d次迭代'%n)
#如果全部数据被分类正确
if np.sum((np.dot(self.tdx,self.w)+self.b)*self.tdy<0)== 0:
break
return self.w,self.b
x=[[3,3],[4,3],[1,1]]
y=[1,1,-1]
p = Perception(x,y)
wo,bo=p.train()
print(wo,bo)