感知机算法案例

采用的测试数据:参考上一篇博客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、运行截图:

原文地址:https://www.cnblogs.com/hhjing/p/14341646.html