一切为了数据挖掘的准备
2.感知机
2.1感知机模型
- 感知机:二类分类的线性模型。
- 数学表达:输入空间
X⊆Rn,输出空间是
y={+1,−1},输入实例x,输出实例y,输入空间到输出空间的函数:
f(x)=sign(wx+b),
w∈Rn,叫做权值,
b∈R叫做偏置。sign函数是符号函数
sign(x)={+1,−1,x⩽0x<0
- 分离超平面S:
wx+b=0对应一个超平面S,w是超平面的法向量,b是超平面的结局,可以将样本点分为正、负两类。
- 对于数据集T,对所有的
yi=+1的实例,
wxi+b>0;
yi=−1的实例,
wxi+b<0,则数据集T为线性可分数据集。
2.2感知机学习策略
- 输入空间
Rn中任一点
x0到超平面S的距离:
∣∣w∣∣1∣wx0+b∣,
∣∣w∣∣是w的
L2范数
- 如果数据正确分类
yi(wxi+b)>0,如果被误分类
yi(wxi+b)<0,误分类点到超平面S的距离
−∣∣w∣∣1yi(wxi+b)
- 损失函数:
L(wx+b)=−∑xi∈Myi(wxi+b),M为误分类的点。这个损失函数就是感知机的经验风险函数。
2.3感知机学习算法
感知机学习算法的原始形式
-
损失函数极小化:
minL(wx+b)=−∑xi∈Myi(wxi+b)
-
梯度下降:
∇wL(w,b)=−xi∈M∑yixi
∇bL(w,b)=−xi∈M∑yi
w←w+ηyixi
b←b+ηyi
-
算法过程
- 选取初值
w0,b0
- 在训练集中选取数据
(xi,yi)
- 如果
yi(wxi+b)⩽0,
w←w+ηyixi,b←b+ηyi,直至此点被正确分类
- 转至第二步,直至训练集中没有误分类点
感知机学习算法的对偶形式
将最后学习到的w,b表示为
w=∑i=1Nαiyixi,b=∑i=1Nαiyi,
αi>0,N为样本量
- 算法过程:感知机模型
f(x)=sign(∑j=iNαjyjxjx+b),其中
α=(α1,α2,⋯,αN)T
-
α←0,b←0
- 训练集中选数据
(xi,yi)
- 如果
yi∑j=iNαjyjxjxi+b⩽0,
αi←αi+η,b←b+ηyi
2.4感知机学习算法收敛证明
设最后线性可分数据集学习的结果为
w^opt⋅x^=wopt⋅x+bopt=0,
∣∣w^opt∣∣=1.
- 存在
γ,对数据集中所有数据,满足
yi(w^opt⋅x^i)=wopt⋅xi+bopt⩾γ,即
γ为离超平面最近的点的距离。
- 假设第k次学习后的学习结果能将数据集完全正确的分开。
w^k−1=(wk−1T,bk−1)T
wk←wk−1+ηyixi,
bk←bk−1+ηyi,
w^k=w^k−1+ηyix^i
w^k⋅w^opt=w^k−1⋅w^opt+ηyiw^optx^i⩾w^k−1⋅w^opt+ηγ⩾w^o⋅w^opt+kηγ
∣∣w^k∣∣2=∣∣w^k−1+ηyix^i∣∣2=∣∣w^k−1∣∣2+2ηyiw^k−1x^i+η2∣∣x^i∣∣2⩽∣∣w^k−1∣∣2+η2R2⩽∣∣w^0∣∣2+kη2R2
kηγ⩽w^k⋅w^opt⩽∣∣w^k∣∣∣∣w^opt∣∣⩽∣∣w^k∣∣2⩽k
ηR
k⩽(γR)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)