统计学习方法笔记与习题解答(Chapter2)

感知机

学习笔记

  • 感知机是二类分类的线性模型,属于判别模型

  • 感知机学习旨在求出将训练数据进行线性划分的分离超平面.是神经网络和支持向量机的基础

  • 损失函数选择

    • 损失函数的一个自然选择是误分类点的总数,但是,这样的损失函数不是参数w,bw,b的连续可导函数,不易优化
    • 损失函数的另一个选择是误分类点到超平面SS的总距离,这正是感知机所采用的
  • 感知机学习的经验风险函数(损失函数)
    L(w,b)=xiMyi(wxi+b) L(w,b)=-\sum_{x_i\in M}y_i(w\cdot x_i+b)
    其中MM是误分类点的集合,给定训练数据集TT,损失函数L(w,b)L(w,b)wwbb的连续可导函数

原始形式算法

输入:训练数据集T={(x1,y1),(x2,y2),,(xN,yN)},xiRn,yi{+1,1},i=1,2,3,,N;0<η1T=\{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\},x_i\in R^n,y_i\in {\{+1,-1\}},i=1,2,3,\dots,N;学习率0<\eta\leqslant 1

输出:w,b;f(x)=sign(wx+b)w,b;感知机模型f(x)=sign(w\cdot x+b)

  1. 选取初值w0,b0w_0,b_0

  2. 训练集中选取数据(xi,yi)(x_i,y_i)

  3. 如果yi(wxi+b)0y_i(w\cdot x_i+b)\leqslant 0
    ww+ηyixibb+ηyi w\leftarrow w+\eta y_ix_i \\ b\leftarrow b+\eta y_i

  4. 转至(2),直至训练集中没有误分类点

  • 这个是原始形式中的迭代公式,可以对xx​补1,将ww​bb​合并在一起,合在一起的这个叫做扩充权重向量

对偶形式算法

  • 对偶形式的基本思想是将wwbb表示为实例xix_i和标记yiy_i的线性组合的形式,通过求解其系数而求得wwbb

输入:T={(x1,y1),(x2,y2),,(xN,yN)},xiRn,yi{+1,1},i=1,2,3,,N;0<η1T=\{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\},x_i\in R^n,y_i\in {\{+1,-1\}},i=1,2,3,\dots,N;学习率0<\eta\leqslant 1

输出:
α,b;f(x)=sign(j=1Nαjyjxjx+b),α=(α1,α2, ,αN)T\alpha ,b; 感知机模型f(x)=sign\left(\sum_{j=1}^N\alpha_jy_jx_j\cdot x+b\right), \alpha=(\alpha_1,\alpha_2,\cdots,\alpha_N)^T

  1. α0,b0\alpha \leftarrow 0,b\leftarrow 0​

  2. 训练集中选取数据(xi,yi)(x_i,y_i)

  3. 如果yi(j=1Nαjyjxjx+b)0y_i\left(\sum_{j=1}^N\alpha_jy_jx_j\cdot x+b\right) \leqslant 0​
    αiαi+ηbb+ηyi \alpha_i\leftarrow \alpha_i+\eta \\ b\leftarrow b+\eta y_i

  4. 转至(2),直至训练集中没有误分类点

  • Gram matrix

    对偶形式中,训练实例仅以内积的形式出现。

    为了方便可预先将训练集中的实例间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的Gram矩阵
    G=[xixj]N×N G=[x_i\cdot x_j]_{N\times N}

习题解答

  • 2.1 Minsky 与 Papert 指出:感知机因为是线性模型,所以不能表示复杂的函数,如异或 (XOR)。验证感知机为什么不能表示异或。
    • 我们显然无法使用一条直线将两类样本划分,异或问题是线性不可分的。
    • 可以借助下面动图理解

统计学习方法笔记与习题解答(Chapter2)

  • 2.2 模仿例题 2.1,构建从训练数据求解感知机模型的例子。
    • 感知机的训练过程如上所述,取与原例题相同的数据,计算出不同的结果
    • x = [3 3; 4 3; 1 1];
      y = [1; 1; -1];
    • 根据程序运行可得:
    • eg1:
      误分类点为: [3 3] 此时的w和b为: [[0.][0.]] 0
      误分类点为: [1 1] 此时的w和b为: [[3.][3.]] 1
      误分类点为: [1 1] 此时的w和b为: [[2.][2.]] 0
      误分类点为: [1 1] 此时的w和b为: [[1.][1.]] -1
      误分类点为: [3 3] 此时的w和b为: [[0.][0.]] -2
      误分类点为: [1 1] 此时的w和b为: [[3.][3.]] -1
      误分类点为: [1 1] 此时的w和b为: [[2. [2.]] -2
      最终训练得到的w和b为: [[1.] [1.]] -3
      f(x)=sign(x(1)+x(2)3)f(x)=sign(x^{(1)}+x^{(2)}-3)
    • eg2:
      误分类点为: [1 1] 此时的w和b为: [[0.] [0.]] 0
      误分类点为: [4 3] 此时的w和b为: [[-1.] [-1.]] -1
      误分类点为: [1 1] 此时的w和b为: [[3.] [2.]] 0
      误分类点为: [1 1] 此时的w和b为: [[2.] [1.]] -1
      最终训练得到的w和b为: [[1.] [0.]] -2
      f(x)=sign(x(1)2)f(x)=sign(x^{(1)}-2)

感知机中的损失函数中的分母为什么可以不考虑?

  1. 感知机处理线性可分数据集,是二分类,所以涉及到的乘以yiy_i的操作实际贡献的是符号;

  2. 损失函数 L(w,b)=xiMyi(wxi+b)L(w,b)=-\sum_{x_i\in M}y_i(w\cdot x_i+b),其中 MM 是错分的点集合,线性可分的数据集肯定能找到超平面 SS, 所以这个损失函数最值是0。

  3. 如果正确分类, yi(wxi+b)=wxi+by_i(w\cdot x_i+b)=|w\cdot x_i+b| ,错误分类的话,为了保证正数就加个负号,这就是损失函数里面那个负号,这个就是函数间隔;

  4. 1w\frac{1}{||w||} 用来归一化超平面法向量,得到几何间隔,也就是点到超平面的距离, 函数间隔和几何间隔的差异在于同一个超平面 (w,b)(w,b) 参数等比例放大成 (kw,kb)(kw,kb) 之后,虽然表示的同一个超平面,但是点到超平面的函数间隔也放大了,但是几何间隔是不变的;

  5. 具体算法实现的时候, ww​要初始化,然后每次迭代针对错分点进行调整,既然要初始化,那如果初始化个 w=1||w||=1​ 的情况也就不用纠结了,和不考虑 1w\frac{1}{||w||}​ 是一样的了;

Python实现感知机

用python实现例2.1的感知机模型学习