1.PPT中定理的证明
P:证明,当w0=0w0=0时,经过TT次迭代,有以下关系式:
wTf‖wf‖wT‖wT‖≥T‾‾√⋅constant
- 下图中通过wfwf与wtwt这两个向量之间求内积说明wtwt与wfwf之间是越来越接近的。见图1:

- 但是内积变大有可能是向量的坐标值的变化,要证明两个向量变的更加接近,还需解决向量长度的问题。见图2:
要证明wTf‖wf‖wT‖wT‖≥T‾‾√⋅constantwfT‖wf‖wT‖wT‖≥T⋅constant并求出constantconstant,首先,
根据图2,‖wt+1‖2≤‖wt‖2+maxn‖ynxn‖2‖wt+1‖2≤‖wt‖2+maxn‖ynxn‖2,那么 ‖wt+T‖2≤‖wt‖2+T⋅maxn‖ynxn‖2‖wt+T‖2≤‖wt‖2+T⋅maxn‖ynxn‖2,
当t=0t=0,并且令w0=0w0=0时,上式变为,‖wT‖2≤0+T⋅maxn‖ynxn‖2‖wT‖2≤0+T⋅maxn‖ynxn‖2
∴∴1‖wT‖≥1T√⋅maxn‖ynxn‖1‖wT‖≥1T⋅maxn‖ynxn‖
根据图1, wTfwt+1≥wTfwt+minn ynwTfxnwfTwt+1≥wfTwt+minn ynwfTxn,那么wTfwt+T≥wTfwt+T⋅minn ynwTfxnwfTwt+T≥wfTwt+T⋅minn ynwfTxn,当t=0t=0并且w0=0w0=0时,则得到,wTfwT≥T⋅minn ynwTfxnwfTwT≥T⋅minn ynwfTxn
∴∴wTfwT‖wf‖≥T⋅minn ynwTfxn‖wf‖wfTwT‖wf‖≥T⋅minn ynwfTxn‖wf‖
将上述两式相乘,
∴∴wTfwT‖wf‖‖wT‖≥T‾‾√minn ynwTfxn‖wf‖maxn ‖ynxn‖wfTwT‖wf‖‖wT‖≥Tminn ynwfTxn‖wf‖maxn ‖ynxn‖
由此也可以求出constantconstant的表达式。
2.PLA代码实现
- 数据下载,放到与代码同级目录下,linux下打开终端运行:
wget https://raw.githubusercontent.com/lxrobot/lxrobot-s-code/master/train_data.txt
"""
Created on Sat Jul 14 17:59:47 2018
@author: lx
"""
from __future__ import division
import pandas as pd
import numpy as np
import random
def getDate(filename):
df=pd.read_csv(filename,delim_whitespace=True,names=['x0','x1','x2','x3','y'])
x=np.asarray(df)
random.shuffle(x)
x_train=x[0:300,:-1]
x_test=x[300:400,:-1]
y_train=x[:300,-1]
y_test=x[300:400,-1]
return x_train,y_train,x_test,y_test
def sign(x):
return -1 if x<0 else 1;
def naive_PLA(X,Y,w,b,alpha,max_steps):
num=len(X)
flag=1
step=0
for i in xrange(max_steps):
flag=1
for j in xrange(num):
y_=w.dot(X[j])+b
if sign(y_)!=Y[j]:
print "The loss of %d step is %5.5f."%(i,y_*Y[j])
flag=0
w+=alpha*Y[j]*X[j]
b+=alpha*Y[j]
break
else:
continue
if flag==1:
step=i
break
return w,b,step
def getAccuracy(X,Y,w,b):
y_=[]
for i in range(len(Y)):
y0=sign(X[i].dot(w)+b)
y_.append(y0)
y_=np.array(y_,dtype=float)
correct=np.flatnonzero(y_-Y)
num=len(Y)
return y_,len(correct)/num
if __name__=='__main__':
filename='train_data.txt'
x_train,y_train,x_test,y_test=getDate(filename)
w=np.zeros((4,))
b=0
alpha=0.00001
max_step=100000
w,b,step=naive_PLA(x_train,y_train,w,b,alpha,max_step)
print "The actual training step is {}".format(step)
y_,acc=getAccuracy(x_test,y_test,w,b)
print y_[:15]
print y_test[:15]
print "The accuracy of PLA is %2.4f%%."%((1.0-acc)*100)