• 感知机算法案例


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

  • 相关阅读:
    Jenkins:自动生成iOS包遇到的问题
    Jenkins将构建结果发送至钉钉群的实现
    Selenium常见API
    Jenkins配置Maven工程
    Appium多设备并行
    使用Docker安装MySQL
    Selenium无界面执行
    mysql 进阶查询(学习笔记)
    xshell 常用命令
    mysql 常用语句
  • 原文地址:https://www.cnblogs.com/hhjing/p/14341646.html
Copyright © 2020-2023  润新知