《统计学习方法》第二章: 感知机 读书笔记


一切为了数据挖掘的准备

2.感知机

2.1感知机模型
  • 感知机:二类分类的线性模型。
  • 数学表达:输入空间 X R n X\subseteq R^n ,输出空间是 y = { + 1 , 1 } y=\{+1,-1\} ,输入实例x,输出实例y,输入空间到输出空间的函数: f ( x ) = s i g n ( w x + b ) f(x) = sign(wx+b) , w R n w \in R^n ,叫做权值, b R b\in R 叫做偏置。sign函数是符号函数 s i g n ( x ) = { + 1 , x 0 1 , x < 0 sign(x)=\begin{cases} +1, & x\leqslant 0 \\ -1, & x <0 \end{cases}
  • 分离超平面S: w x + b = 0 wx+b=0 对应一个超平面S,w是超平面的法向量,b是超平面的结局,可以将样本点分为正、负两类。
  • 对于数据集T,对所有的 y i = + 1 y_i = +1 的实例, w x i + b > 0 wx_i+b>0 ; y i = 1 y_i = -1 的实例, w x i + b < 0 wx_i+b<0 ,则数据集T为线性可分数据集。
2.2感知机学习策略
  • 输入空间 R n R^n 中任一点 x 0 x_0 到超平面S的距离: 1 w w x 0 + b \frac{1}{||w||}|wx_0+b| , w ||w|| 是w的 L 2 L_2 范数
  • 如果数据正确分类 y i ( w x i + b ) > 0 y_i(wx_i+b)>0 ,如果被误分类 y i ( w x i + b ) < 0 y_i(wx_i+b)<0 ,误分类点到超平面S的距离 1 w y i ( w x i + b ) -\frac{1}{||w||}y_i(wx_i+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) ,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)

  • 梯度下降:
    w L ( w , b ) = x i M y i x i \nabla_wL(w,b)=-\sum_{x_i \in M}y_ix_i
    b L ( w , b ) = x i M y i \nabla_bL(w,b)=-\sum_{x_i \in M}y_i
    w w + η y i x i w \leftarrow w + \eta y_ix_i
    b b + η y i b \leftarrow b + \eta y_i

  • 算法过程

    • 选取初值 w 0 , b 0 w_0,b_0
    • 在训练集中选取数据 ( x i , y i ) (x_i,y_i)
    • 如果 y i ( w x i + b ) 0 y_i(wx_i+b)\leqslant 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,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 , α i > 0 \alpha_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) ,其中 α = ( α 1 , α 2 ,   , α N ) T \alpha=(\alpha_1,\alpha_2,\cdots,\alpha_N)^T
    • α 0 , b 0 \alpha \leftarrow 0,b \leftarrow 0
    • 训练集中选数据 ( x i , y i ) (x_i,y_i)
    • 如果 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 , α i α i + η , b b + η y i \alpha_i \leftarrow \alpha_i + \eta ,b \leftarrow b + \eta y_i
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 ^ o p t = 1 ||\hat{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 ,即 γ \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 w k 1 + η y i x i , w_k \leftarrow w_{k-1} + \eta y_ix_i,
    b k b k 1 + η y i , b_{k} \leftarrow b_{k-1} + \eta y_i,
    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 ^ 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 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
    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 ( R γ ) 2 k\leqslant(\frac{R}{\gamma})^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)

猜你喜欢

转载自blog.csdn.net/liuerin/article/details/89094813