机器学习基石(2) - Perceptron Learning Algorithm

Notation

A : 机器学习算法
f : 未知的目标函数
D: 训练集合。 (xn,yn)D 表示一个样本点,其中 yn=f(xn)
H : 假设函数集合(hypothesis set)。 hH 表示一个假设函数
g : A H 中选出的最接近 f 的假设函数

An example

银行要不要向信用卡申请人发放信用卡:Yes|No?
已知信息:
银行提供了一堆历史数据,(xn,yn)D,n{1,2,3,...,N}, 其中 xn 是一个高维向量,表示用户的个人信息,诸如年龄、收入、贷款等等, yn{1,+1} ,分别表示不发信用卡和发信用卡两种情形
未知信息:
1. 该用什么样的 H 呢?
2. 假设有了一个 H ,该怎么从中选呢?

一个简单的 H : Perceptron(感知器)

Perceptron的假设函数为,

h(xn)=sign(wTxnthreshold)

结合发信用卡的例子, h(xn) 实际上是把申请人的各项信息加权求和,然后和一个阈值做比较。如果大于阈值,则向此申请人发信用卡,否则不发。
w{threshold,w} , xn{1,xn} ,则 h(xn) 可以变换为,
h(xn)=sign(wTxn)

从几何的角度看, h 对应的是空间里的一条直线或者一个超平面(w表示 h 的法向量),把数据分隔在两边。如下图所示,
图片源自课程

H选择 g

PLA算法

如果存在gf D 上,理想情况下,对任意的xn,都有 g(xn)=f(xn)=yn
反过来是否成立呢?课程在后面的章节中会再论述。
此处,可以暂且认为,反过来也是成立的。
所以,问题转化为,从 H 找到在 D 上表现最好的g

难点: H 集合无限大
方法:从任意 h 开始,慢慢修正它,直到达到最好的结果。因为h是由 w 确定的(Perceptron函数的定义),所以调整w即是在调整 h

  1. 什么时候调整?
    h(xn)yn

    • 错误发生时,如何调整?
      如果 yn=1, h(xn)=1 ,意味着 w xn的夹角过大 w xn靠近一些: ww+xn
      如果 yn=1, h(xn)=1 ,意味着 w xn的夹角过小 w xn远离一些: wwxn
      综上, ww+ynxn

    • 代码
      demo (TODO)

    • # 待验证
      import numpy as np
      
      def sign(x, w):
          if np.dot(x, w) >= 0:
              return 1
          else:
              return -1
      
      def PLA(X, Y):
          """
          Perceptron Learning algorithm API
          :param X: training data
          :param Y: label data {-1, 1}
          :return: best hypothesis function <g>
          """
          num, d = np.shape(X)
          w = np.zeros(d) # 初始化
      
          while True:
              halt = True
              for n in range(num):
                  if sign(X[n], w) != Y[n]: # 错误发生了,需要调整
                      halt = False
                      w = w + Y[n] * X[n] # 调整的办法
                      break
                  else:
                      continue
              if halt:
                  break
          return w

      Guarantee of PLA

      PLA面临的几个问题:
      1. PLA算法一定会终止吗?
      2. 如果能终止,在 D 以外,一定有gf吗?
      3. 如果不能终止,怎么办?

      终止条件

      容易得出,PLA可以终止 D 线性可分。
      那么, D 线性可分 PLA可以终止,是不是一定正确?
      证明:
      1. D 线性可分 wf表示的线(面)可以把 D 分开
      2. 计算PLA每次调整w时,能否靠近 wf (夹角越来越小),即 wtwfwtwf 是不是随着每次调整在递增。
      首先来看 wtwf 因为调整发生在分错的情况下,所以

      wtwf=wTfwt=wTf(wt1+yn(t1)xn(t1))

      =wTfwt1+yn(t1)wTfxn(t1)

      又因为, wf 能分对所有点,所以对任意的 xn ,都有 ynwTfxn0 。所以,

      wtwfwTfwt1+minynwTfxn

      wTfwt2+2minynwTfxnwTfw0+TminynwTfxn

      再来看 wtwf ,因为 wt=wTtwt ,所以先计算 wTtwt

      wTtwt=(wt1+yn(t1)xn(t1))T(wt1+yn(t1)xn(t1))

      =wTt1wt1+2yn(t1)wTt1xn(t1)+xTn(t1)xn(t1)

      wTt1wt1+xTn(t1)xn(t1)wTt1wt1+maxxTnxn

      wTt2wt2+2maxxTnxnwT0w0+TmaxxTnxn

      综上,
      wtwfwtwfwTfw0+TminynwTfxnwfwT0w0+TmaxxTnxn

      因为PLA初始化 w0=0 , 所以
      wtwfwtwfTminynwTfxnwfTmaxxTnxn

      从这个不等式可以看出,不等式的右侧是关于 T 的单调递增函数。所以PLA在每次调整w时,的确是向着 wf 的方向进行的。意味着,PLA最终能选到 wf ,把 D 完美划分开。
      结论:PLA可以终止 D 线性可分 (充分必要条件)

      D 线性不可分

      如下图所示,在训练集上,数据可能有噪声,导致D上大部分数据可以被 wf 分正确,少部分会被分错。
      源自课程
      在这种情况下,一个合理的做法是,选分错数据最少的那条线:

      wg=argminwn=1N1(ynsign(wTxn))

      使用贪心算法来求解 wg ,把PLA算法修改为,

      import numpy as np
      
      def sign(x, w):
          if np.dot(x, w) >= 0:
              return 1
          else:
              return -1
      
      
      def misclassified(X, Y, w):
          num = np.shape(X)[0]
          count = 0
          for n in range(num):
              if sign(X[n], w) != Y[n]:
                  count += 1
          return count
      
      
      def Pocket_PLA(X, Y, iteration):
          num, d = np.shape(X)
          w = np.zeros(d)
          sample_index = np.arange(num)
          err = d  # suppose all training samples are misclassified
      
          for i in range(iteration):
              np.random.shuffle(sample_index)
              halt = True
              for n in sample_index:
                  # randomly select the misclassified training sample
                  if sign(X[n], w) != Y[n]:  
                      new_w = w + Y[n] * X[n]
                      new_err = misclassified(X, Y, new_w)
                      if new_err < err:
                          w = new_w
                          err = new_err
                          halt = False
                          break
              if halt:
                  iteration = i
                  break
      
          return w, iteration
      

      总结

      PLA可以终止 D 线性可分
      PLA优点:实现简单、效率高、可扩展到任意维度
      PLA缺点:太强的假设条件( D <script type="math/tex" id="MathJax-Element-222">D</script>线性可分); 即使在线性可分的前提下,不确定算法什么时候会终止

      课程作业

      TODO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值