机器学习——感知器算法及python实现

来源:互联网 发布:淘宝联盟手机版5.2苹果 编辑:程序博客网 时间:2024/06/09 05:41

说明:本文从自己的理解出发来讲解感知器是如何训练的,如想知道比较学术的概念,请查阅相关论文。

1、什么是感知器

本文假设数据为:二维二类、线性可分

感知器就是一个分类器,如:给两类数据做训练集A,B,训练完成之后,给定一个测试数据,通过感知器,可以分成A或B。

因为数据是二维线性可分的,我们不妨假设该线性方程为w0*x0+w1*x1+w2 = 0

2、如何训练

训练的最终结果是训练集中A的结果在直线的一侧,假设经过过滤器后其值<0; B的结果在直线的另一侧经过过滤器后其值>0。

可以先给w=[w0,w1,w2]赋一个初始值如w=[1,1,1]。


如果训练集中的点x的标签为A,且带入线性方程后的值<0,则当前感知器对x点分类正确,不对w进行调整

如果训练集中的点x的标签为A,且带入线性方程后的值>=0,则当前感知器对x点分类不正确,对w进行调整。

本来应该<0,但结果>=0,所以w调整原则为w =w-x。因为wx>(w-x)*x,能够使调整后的结果变小


如果训练集中的点x的标签为B,且带入线性方程后的值>0,则当前感知器对x点分类正确,不对w进行调整

如果训练集中的点x的标签为B,且带入线性方程后的值<=0,则当前感知器对x点分类不正确,对w进行调整。

本来应该>0,但结果<=0,所以w调整原则为w =w+x。因为wx<(w+x)*x,能够使调整后的结果变大


其中应为w比x多了一个维度,对x的处理方式是采用增量模式,即每个样本的第三维度都为1


3、python代码实现

%matplotlib inlineimport numpy as npimport matplotlib.pyplot as pltw = [1,1,1]x1 =[[1,0,1],[0,1,1],[2,0,1],[2,2,1]]x2=[[-1,-1,1],[-1,0,1],[-2,-1,1],[0,-2,1]]flag = Falsewhile flag != True:    for i in range(4):        t = 0        for j in range(3):            t += w[j]*x1[i][j]        if(t <= 0):           for j in range(3):            w[j] +=x1[i][j]    for i in range(4):       t = 0       for j in range(3):           t += w[j]*x2[i][j]       if(t >= 0):           for j in range(3):                w[j] -=x2[i][j]    flag = True    for i in range(4):        t1 = 0        t2 = 0        for j in range(3):            t1 += w[j]*x1[i][j]            t2 += w[j]*x2[i][j]        if (t1 <=0 ):            flag =False            break        if(t2 >=0):            flag = False            breakplt.figure()for i in range(4):    plt.scatter(x1[i][0],x1[i][1],c = 'r',marker='o')    plt.scatter(x2[i][0],x2[i][1],c = 'g',marker='*')plt.grid()p1=[-2.0,2.0]p2=[(-w[2]+2*w[0])/w[1],(-w[2]-2*w[0])/w[1]]plt.plot(p1,p2)plt.show()

4、测试结果


5、结果分析

该算法对线性可分的数据进行分类,若非线性可分,会导致死循环

0 0
原创粉丝点击