机器学习基石笔记-感知机
损失函数
给定一个数据集 T={(x1,y1),(x2,y2),⋯,(xN,yN)}其中x=Rn,y={+1,−1}
若存在超平面S
w⋅x+b=0
能将所有的正负实例点分到两侧,则称数据集是线性可分的,否则称线性不可分。
任意一点
x0
到超平面的距离为
1||w|||w⋅x0+b|
对于误分类数据 (xi,yi) 来说,
−yi(w⋅xi+b)>0
有误分类点到超平面距离
−1||w||yi|w⋅x0+b|
则所有误分类点到超平面距离为
−1||w||∑xi∈myi|w⋅x0+b|
所以感知机 sign(w⋅x+b) 学习损失函数为
L(w,b)=−∑xi∈myi|w⋅x0+b|
学习算法
- 选取初值 w0,b0
- 在训练集中选取数据 (xi,yi)
- 如果
yi(w⋅xi+b)≤0
(分类错误)
w←w+xiyi - 转至2,直至没有误分类点。
收敛性
令
R=max||xi||
,令
ρ=minWf||wf||xiyi
则有修正次数
k≤R2ρ2
下面给出证明。
由 wk⋅wf=wk−1wf+xiyi≥wk−1+ρ≥⋯≥kρ
||wk||2=||wk−1+xiyi||2=||wk−1||2+2wk−1xiyi+||xiyi||2≤||wk−1||2+||xiyi||2≤||wk−1||2+R2
故 ||wk||2≤||wk−1||2+R2≤⋯≤kR2
故
kρ≤wk⋅wf≤||wk||⋅||wf||≤||wk||≤k√R
故 kρ≤k√R ,易得 k≤R2ρ2 ,得证。
其他性质
- 一般用加上速度后的修正式: w←w+η⋅xiyi 来修正直线。
- 读入数据的次序是影响修正次数的。
示范代码
import numpy as np
def sign(x):
if x < 0:
return -1
else:
return 1
w = np.array([0.,0.,0.,0.,0.])
halts = 0
speed = 1
f = open('pla.dat')
while True:
data = f.readline()
if data == '':
break
datas = data.split('\t')
xi = np.array([float(i) for i in ('1 ' + datas[0]).split()])
yi = float((datas[1].split())[0])
if not abs(yi) == 1 :
exit(1)
if not sign(np.inner(w,xi)) == yi:
w = w + speed * yi * xi
print("W: " + str(w))
halts += 1
print('Halts :' + str(halts))