前言:本文是李航统计学习方法第二章《感知机》的python代码实现,与在下的统计学习系列博文搭配使用。
感知机的代码实现较为简单,感知机原理请移步感知机.
代码如下:
import pandas as pd
import numpy as np
##生成数据集
df=pd.DataFrame({'x1':[3,4,1],
'x2':[3,3,1],
'y':[1,1,-1]})
#定义感知机主题函数
def Perceptron(df,xlist,y,eta,maxiter):
###df是训练集,xlist是训练集中x字段的list,
#y是标签名,type为str,eta是学习率,maxiter是最大迭代次数###
tmp=df.copy()
n=len(xlist)
##初始化w b
w=np.asarray(np.zeros(n))
b=0
#初始化误分类点和迭代次数i
tmp_wrong=pd.DataFrame([1])
i=1
##计算损失
while (len(tmp_wrong)>0)&(i<=maxiter):
tmp['loss']=np.asmatrix(df[xlist])*np.asmatrix(w).T+b
tmp['loss1']=tmp['loss']*tmp[y]
##抓取误分类点集##
tmp_wrong=tmp[tmp['loss1']<=0]
if len(tmp_wrong)>0:
##选择损失最大的误分类点进行迭代
wrong_index=tmp_wrong['loss1'].idxmin()#抓取其行索引
#迭代
wrong_index=tmp_wrong['loss1'].idxmin()
w=w+eta*np.asarray(tmp.loc[wrong_index,y])*np.asarray(tmp.loc[wrong_index,xlist])
b=b+eta*np.asarray(tmp.loc[wrong_index,y])
i+=1
else:
break
# 打印相关信息
print('总共迭代了%s次,w为'%(i))
print(w)
print('b=%s'%(b))
#返回w和b
return w,b
结果如下:
w1,b1=Perceptron(df,['x1','x2'],y='y',eta=0.3,maxiter=100)
#总共迭代了8次,w为
#[0.6 0.3]
#b=-0.8999999999999999