转自:https://blog.csdn.net/u010626937/article/details/72896144#commentBox

1.实现原始形式

import numpy as np
import matplotlib.pyplot as plt#1、创建数据集
def createdata():samples=np.array([[3,-3],[4,-3],[1,1],[1,2]])#4行2列labels=[-1,-1,1,1]return samples,labels#训练感知机模型
class Perceptron:def __init__(self,x,y,a=1):self.x=xself.y=yself.w=np.zeros((x.shape[1],1))#初始化权重,w1,w2均为0self.b=0self.a=1#学习率self.numsamples=self.x.shape[0]self.numfeatures=self.x.shape[1]def sign(self,w,b,x):y=np.dot(x,w)+breturn int(y)def update(self,label_i,data_i):tmp=label_i*self.a*data_itmp=tmp.reshape(self.w.shape)#转换成w的形状。#更新w和bself.w=tmp+self.wself.b=self.b+label_i*self.adef train(self):isFind=Falsewhile not isFind:count=0for i in range(self.numsamples):tmpY=self.sign(self.w,self.b,self.x[i,:])if tmpY*self.y[i]<=0:#如果是一个误分类实例点print ('误分类点为:',self.x[i,:],'此时的w和b为:',self.w,self.b)count+=1self.update(self.y[i],self.x[i,:])#更新if count==0:print ('最终训练得到的w和b为:',self.w,self.b)isFind=Truereturn self.w,self.b#画图描绘
class Picture:def __init__(self,data,w,b):self.b=bself.w=wplt.figure(1)plt.title('Perceptron Learning Algorithm',size=14)plt.xlabel('x0-axis',size=14)plt.ylabel('x1-axis',size=14)xData=np.linspace(0,5,100)#start stop 要生成的样本数,是一个arrayyData=self.expression(xData)#
        plt.plot(xData,yData,color='r',label='sample data')plt.scatter(data[0][0],data[0][1],s=50)plt.scatter(data[1][0],data[1][1],s=50)plt.scatter(data[2][0],data[2][1],s=50,marker='x')plt.scatter(data[3][0],data[3][1],s=50,marker='x')plt.savefig('2d.png',dpi=75)def expression(self,x):#只是为了画出这一条直线。y=(-self.b-self.w[0]*x)/self.w[1]#注意在此,把x0,x1当做两个坐标轴,把x1当做自变量,x2为因变量return ydef Show(self):plt.show()if __name__ == '__main__':samples,labels=createdata()myperceptron=Perceptron(x=samples,y=labels)weights,bias=myperceptron.train()Picture=Picture(samples,weights,bias)Picture.Show()

运行结果:

误分类点为: [ 3 -3] 此时的w和b为: [[0.][0.]] 0
误分类点为: [1 1] 此时的w和b为: [[-3.][ 3.]] -1
最终训练得到的w和b为: [[-2.][ 4.]] 0

//真是太厉害了。

2.实现对偶形式

import numpy as np
import matplotlib.pyplot as plt#1、创建数据集
def createdata():samples=np.array([[3,-3],[4,-3],[1,1],[1,2]])labels=np.array([-1,-1,1,1])return samples,labels#训练感知机模型
class Perceptron:def __init__(self,x,y,a=1):self.x=xself.y=yself.w=np.zeros((1,x.shape[0]))#1行4列self.b=0self.a=1#学习率self.numsamples=self.x.shape[0]self.numfeatures=self.x.shape[1]self.gMatrix=self.cal_gram(self.x)def cal_gram(self,x):gMatrix=np.zeros((self.numsamples,self.numsamples))for i in range(self.numsamples):for j in range(self.numsamples):gMatrix[i][j]=np.dot(self.x[i,:],self.x[j,:])return gMatrixdef sign(self,w,b,key):y=np.dot(w*self.y,self.gMatrix[:,key])+breturn int(y)def update(self,i):print(i,'@@@iii')self.w[:,i]=self.w[:,i]+self.aself.b=self.b+self.y[i]*self.adef cal_w(self):w=np.dot(self.w*self.y,self.x)return wdef train(self):isFind=Falsewhile not isFind:count=0for i in range(self.numsamples):tmpY=self.sign(self.w,self.b,i)if tmpY*self.y[i]<=0:#如果是一个误分类实例点print('误分类点为:',self.x[i,:],'此时的w和b为:',self.cal_w(),',',self.b)count+=1self.update(i)if count==0:print ('最终训练得到的w和b为:',self.cal_w(),',',self.b)print(self.w)isFind=Trueweights=self.cal_w()return weights,self.b#画图描绘
class Picture:def __init__(self,data,w,b):self.b=bself.w=wplt.figure(1)plt.title('Perceptron Learning Algorithm',size=14)plt.xlabel('x0-axis',size=14)plt.ylabel('x1-axis',size=14)xData=np.linspace(0,5,100)yData=self.expression(xData)plt.plot(xData,yData,color='r',label='sample data')plt.scatter(data[0][0],data[0][1],s=50)plt.scatter(data[1][0],data[1][1],s=50)plt.scatter(data[2][0],data[2][1],s=50,marker='x')plt.scatter(data[3][0],data[3][1],s=50,marker='x')plt.savefig('2d.png',dpi=75)def expression(self,x):y=(-self.b-self.w[:,0]*x)/self.w[:,1]return ydef Show(self):plt.show()if __name__ == '__main__':samples,labels=createdata()myperceptron=Perceptron(x=samples,y=labels)weights,bias=myperceptron.train()Picture=Picture(samples,weights,bias)Picture.Show()

//注:原博主的update的函数有误,应该是对w的列+a,而不是行。。。现在已经更改。 结果也是正确的结果。

运行结果:

误分类点为: [ 3 -3] 此时的w和b为: [[0. 0.]] , 0
0 @@@iii
误分类点为: [1 1] 此时的w和b为: [[-3. 3.]] , -1
2 @@@iii
最终训练得到的w和b为: [[-2. 4.]] , 0
[[1. 0. 1. 0.]]

注:最后一行是——w。

讨论:

转:https://blog.csdn.net/qq_28618765/article/details/78083179

dot()函数是矩阵乘,而*则表示逐个元素相乘

以及关于这个向量和矩阵乘法的问题:

array对于这种shape函数结果是(3,)类型的,它在运算时是十分灵活的,既可以作为列向量,也可以作为行向量。

import numpy as npx=[[1,2,3],[4,5,6]]
y=[1,2,3]
xy=np.dot(x,y)
print(xy,xy.shape)z=[1,2]
xy2=np.dot(z,x)
print(xy2,xy2.shape)

结果:

[14 32] (2,)
[ 9 12 15] (3,)

对于y右乘x,是作为列向量处理了;对于z坐成x,是作为行向量处理了。

3.关于矩阵运算的一些坑试跳

import numpy as npx=[[1,1,1,1]]
#print(x.shape)
#报错:AttributeError: 'list' object has no attribute 'shape'

y=[1,1,1,1]
#print(y.shape)
#报错:AttributeError: 'list' object has no attribute 'shape'

z=np.array([1,1,1,1])
print(z.shape)
#输出:(4,)

z[2,]=z[2,]+1
print(z)
#输出:[1 1 2 1]

u=np.matrix([1,2,3,4])
print(u.shape)
#输出:(1, 4)

u[:,1]=u[:,1]+1
print(u)
#输出:[[1 3 3 4]]#u[1,]=u[1,]+10
#print(u)
#输出:IndexError: index 1 is out of bounds for axis 0 with size 1print(u[0,])
#输出:[[1 3 3 4]]

u[:,1]=u[:,1]+10
print(u)
#输出:[[ 1 13  3  4]]print(u[0])
#输出:[[ 1 13  3  4]]
#说明:取矩阵的一行是可以使用u[1]或者u[1,]的
#但是取矩阵的一列必须使用:,u[:,1],否则会报错。

转载于:https://www.cnblogs.com/BlueBlueSea/p/10065114.html

感知机PLA算法实现[转载]相关推荐

  1. 写给大家看的机器学习书【Part3】直观易懂的感知机学习算法PLA

    作者:徐晗曦 原文:写给大家看的机器学习书(第三篇) 本次转载已获得作者授权,尊重原创,若需转载请联系作者本人. 相关文章: 写给大家看的机器学习书[Part1]什么是机器学习?机器学到的到底是什么? ...

  2. 调用sklearn包中的PLA算法[转载]

    转自:https://blog.csdn.net/u010626937/article/details/72896144#commentBox 1.Python的机器学习包sklearn中也包含了感知 ...

  3. 线性模型篇之感知机(PLA)数学公式推导

    转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thi ...

  4. 模式识别算法之2--感知器(感知机)算法

    说明:摘自维基百科 目录: 感知器介绍 历史  结构 感知器介绍     感知机(英语:Perceptron)是Frank Rosenblatt在1957年就职于Cornell航空实验室(Cornel ...

  5. 人工神经网络(ANN/NN)、感知机(PLA)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 2.2 神经网络简介 2.2.1 什么是神经网络 人工神经网络 ...

  6. [机器学习][1]--PLA算法

    [机器学习][1]--PLA算法     PLA全称为,Perception Learning Algorithm,中文叫感知学习算法.今天我会简单介绍一下这个算法,并用mathematica来实现一 ...

  7. PLA算法实现与展示

    1.PLA算法 作为机器学习的入门基础算法,主要是要理解其产生由来.感知机模型为了应对线性可分二分类问题而设计的算法,求得一个超平面S使得所有数据能正确分类. 即使得每个数据都 f ( x ) = s ...

  8. PLA算法(机器学习基石)

    PLA算法的机制 故事起源于一个二元分类问题(比如说银行要不要给客户发信用卡的问题) 我们的先决条件 1.我们有资料在手上(用户信息) 2.我们的资料有标签(有没有发信用卡) 3.假设我们的资料是线性 ...

  9. java实现一个感知机_感知机学习算法Java实现

    感知机学习算法Java实现. Perceptron类用于实现感知机, 其中的perceptronOriginal()方法用于实现感知机学习算法的原始形式: perceptronAnother()方法用 ...

最新文章

  1. 关于easyui中的editIndex
  2. sqlite数据库android使用教程,Android开发教程之 SQLite数据库的使用
  3. boost::detail::lexical_cast_stream_traits用法的测试程序
  4. Python攻克之路-网络编程(文件上传实现思路)
  5. 500张思维导图记38000单词_思维导图记单词,环环相扣难遗忘——2020奇速英语夏令营第三天...
  6. python tkinter数据库通讯录_TKINTER--GUI连接数据库登陆
  7. Qt文档阅读笔记-Qt工作笔记-QThread解析与实例(主线程发送信号给子线程)
  8. php对键盘控制,键盘控制 - 陈映亮的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. [转载] python机器学习第三章:使用scikit-learn实现机器学习分类算法
  10. PHP中去除换行解决办法小结(PHP_EOL)
  11. XP系统装python
  12. 小程序调用百度api实现图像识别
  13. 【入门必看-算法基础知识讲解】小白都也能看得懂
  14. GNSS螺旋天线高精度定位
  15. linux电脑外放没声音,ubuntu 16.04安装好后没声音的解决方法
  16. python exe文件反编译_[原创]python exe文件解包方法总结
  17. Markdown流程图
  18. java+mysql基于SSM的班级管理系统#毕业设计
  19. 智力题——1红蓝墨水
  20. STM32单片机接直流减速电机编码器注意点

热门文章

  1. day12【过渡】SpringCloud
  2. linux nona怎么用_Linux nano编辑器命令常用方法
  3. android go 刷机教程,安卓用的久了,如何刷机?安卓手机线刷教程
  4. php ds扩展,PHP教程:老生常谈PHP中的数据结构:DS扩展
  5. bwl老二吃嘲讽吗_怀旧服BWL2小时全通最简打法!时光点燃一次过
  6. 自实现进程管理器linux,【Linux工具篇】supervisor进程管理器
  7. Spring MVC上传文件后重命名读取不显示,报错已解决(The origin server did not find a current representation for the targe)
  8. greenplum数据导入到mysql,将数据从DB2数据库传输到greenplum数据库
  9. 广东机电职业技术学校计算机怎么样,广东机电职业技术学院宿舍怎么样 住宿条件好不好...
  10. springboot 获取web服务端口_我是这样使用SpringBoot(WEB服务)