机器学习——感知器算法及python实现
Posted 逗逗飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习——感知器算法及python实现相关的知识,希望对你有一定的参考价值。
说明:本文从自己的理解出发来讲解感知器是如何训练的,如想知道比较学术的概念,请查阅相关论文。
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 inline
import numpy as np
import matplotlib.pyplot as plt
w = [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 = False
while 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
break
plt.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、结果分析
该算法对线性可分的数据进行分类,若非线性可分,会导致死循环
以上是关于机器学习——感知器算法及python实现的主要内容,如果未能解决你的问题,请参考以下文章