Notation
A
: 机器学习算法
f
: 未知的目标函数
H
: 假设函数集合(hypothesis set)。
h∈H
表示一个假设函数
g
:
An example
银行要不要向信用卡申请人发放信用卡:Yes|No?
已知信息:
银行提供了一堆历史数据,
未知信息:
1. 该用什么样的
H
呢?
2. 假设有了一个
H
,该怎么从中选呢?
一个简单的 H : Perceptron(感知器)
Perceptron的假设函数为,
结合发信用卡的例子, h(xn) 实际上是把申请人的各项信息加权求和,然后和一个阈值做比较。如果大于阈值,则向此申请人发信用卡,否则不发。
另 w←{−threshold,w} , xn←{1,xn} ,则 h(xn) 可以变换为,
从几何的角度看, h 对应的是空间里的一条直线或者一个超平面(
从H 选择
g
PLA算法
如果存在
反过来是否成立呢?课程在后面的章节中会再论述。
此处,可以暂且认为,反过来也是成立的。
所以,问题转化为,从
H
找到在
D
上表现最好的
难点:
H
集合无限大
方法:从任意
h
开始,慢慢修正它,直到达到最好的结果。因为
什么时候调整?
当h(xn)≠yn 时错误发生时,如何调整?
如果 yn=1, h(xn)=−1 ,意味着 w 和xn 的夹角过大 ⇒ w 向xn 靠近一些: w←w+xn
如果 yn=−1, h(xn)=1 ,意味着 w 和xn 的夹角过小 ⇒ w 向xn 远离一些: w←w−xn
综上, w←w+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 以外,一定有g≈f 吗?
3. 如果不能终止,怎么办?终止条件
容易得出,PLA可以终止 ⇒D 线性可分。
那么, D 线性可分⇒ PLA可以终止,是不是一定正确?
证明:
1. D 线性可分⇒∃wf 表示的线(面)可以把 D 分开
2. 计算PLA每次调整w 时,能否靠近 wf (夹角越来越小),即 wt⋅wf∥wt∥∥wf∥ 是不是随着每次调整在递增。
首先来看 wt⋅wf 。因为调整发生在分错的情况下,所以
wt⋅wf=wTfwt=wTf(wt−1+yn(t−1)xn(t−1))
=wTfwt−1+yn(t−1)wTfxn(t−1)
又因为, wf 能分对所有点,所以对任意的 xn ,都有 ynwTfxn≥0 。所以,wt⋅wf≥wTfwt−1+minynwTfxn
≥wTfwt−2+2minynwTfxn≥⋅⋅⋅≥wTfw0+TminynwTfxn再来看 ∥wt∥∥wf∥ ,因为 ∥wt∥=wTtwt√ ,所以先计算 wTtwt
wTtwt=(wt−1+yn(t−1)xn(t−1))T(wt−1+yn(t−1)xn(t−1))
=wTt−1wt−1+2yn(t−1)wTt−1xn(t−1)+xTn(t−1)xn(t−1)
≤wTt−1wt−1+xTn(t−1)xn(t−1)≤wTt−1wt−1+maxxTnxn
≤wTt−2wt−2+2maxxTnxn≤⋅⋅⋅≤wT0w0+TmaxxTnxn
综上,
wt⋅wf∥wt∥∥wf∥≥wTfw0+TminynwTfxn∥wf∥wT0w0+TmaxxTnxn√
因为PLA初始化 w0=0 , 所以
wt⋅wf∥wt∥∥wf∥≥TminynwTfxn∥wf∥TmaxxTnxn√
从这个不等式可以看出,不等式的右侧是关于 T 的单调递增函数。所以PLA在每次调整w 时,的确是向着 wf 的方向进行的。意味着,PLA最终能选到 wf ,把 D 完美划分开。
结论:PLA可以终止⇔D 线性可分 (充分必要条件)D 线性不可分
如下图所示,在训练集上,数据可能有噪声,导致
D 上大部分数据可以被 wf 分正确,少部分会被分错。
在这种情况下,一个合理的做法是,选分错数据最少的那条线:
wg=argminw∑n=1N1(yn≠sign(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