采用的测试数据:参考上一篇博客4.1部分
https://www.cnblogs.com/hhjing/p/14340924.html
1、用一个perception函数实现上述算法。为了深入观察算法运行过程,我们保留每一轮迭代的参数w,并对每一轮迭代中随机选取的样本进行记录。所以,perception函数返回三个取值:最终学习到的参数w,每轮迭代的参数w,每轮迭代随机选取的样本mis_samples
def perception(X,y,learning_rate,max_iter=1000): w=pd.Series(data=np.zeros_like(X.iloc[0]),index=X.columns)#初始化参数w0 W=[w]#定义一个列表存放每次迭代的参数 mis_samples=[]#存放每次误分类的样本 for t in range(max_iter): #2.1寻找误分类集合M m=(X.dot(w))*y#yw^Tx<0的样本为误分类样本 X_m=X[m<=0]#误分类样本的特征数据 y_m=y[m<=0]#误分类样本的标签数据 if(len(X_m)>0):#如果有误分类样本,则更新参数;如果不再有误分类样本,则训练完毕 #2.2从M中随机选取一个样本i i=np.random.randint(len(X_m)) mis_samples.append(X_m.iloc[i,:]) #2.3更新参数w w=w+learning_rate*y_m.iloc[i]*X_m.iloc[i,:] W.append(w) else: break mis_samples.append(pd.Series(data=np.zeros_like(X.iloc[0]),index=X.columns)) return w,W,mis_samples
2、使用随机生成的数据集来测试一下感知机算法
w_percept,W,mis_samples=perception(data[["x1","x2","ones"]],data["label"],1,max_iter=1000)
3、首先将学到的感知机的决策直线可视化,观察分类效果
x1=np.linspace(-6,6,50)
x2=-(w_percept[0]/w_percept[1])*x1-w_percept[2]/w_percept[1]
plt.figure(figsize=(8,8))#设置图片尺寸 plt.scatter(data_pos["x1"],data_pos["x2"],c="#E4007F",marker="^")#类别为1的数据绘制成洋红色 plt.scatter(data_neg["x1"],data_neg["x2"],c="#007979",marker="o")#类别为-1的数据绘制成深绿色 plt.plot(x1,x2,c="gray")#画出分类直线 plt.xlabel("$x_1$")#设置横轴标签 plt.ylabel("$x_2$")#设置纵轴标签 plt.title('手动实现的感知机模型') plt.xlim(-6,6)#设置横轴显示范围 plt.ylim(1,5)#设置纵轴显示范围 plt.show()
4、运行截图: