感知机PLA算法实现[转载]
转自: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算法实现[转载]相关推荐
- 写给大家看的机器学习书【Part3】直观易懂的感知机学习算法PLA
作者:徐晗曦 原文:写给大家看的机器学习书(第三篇) 本次转载已获得作者授权,尊重原创,若需转载请联系作者本人. 相关文章: 写给大家看的机器学习书[Part1]什么是机器学习?机器学到的到底是什么? ...
- 调用sklearn包中的PLA算法[转载]
转自:https://blog.csdn.net/u010626937/article/details/72896144#commentBox 1.Python的机器学习包sklearn中也包含了感知 ...
- 线性模型篇之感知机(PLA)数学公式推导
转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thi ...
- 模式识别算法之2--感知器(感知机)算法
说明:摘自维基百科 目录: 感知器介绍 历史 结构 感知器介绍 感知机(英语:Perceptron)是Frank Rosenblatt在1957年就职于Cornell航空实验室(Cornel ...
- 人工神经网络(ANN/NN)、感知机(PLA)
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 2.2 神经网络简介 2.2.1 什么是神经网络 人工神经网络 ...
- [机器学习][1]--PLA算法
[机器学习][1]--PLA算法 PLA全称为,Perception Learning Algorithm,中文叫感知学习算法.今天我会简单介绍一下这个算法,并用mathematica来实现一 ...
- PLA算法实现与展示
1.PLA算法 作为机器学习的入门基础算法,主要是要理解其产生由来.感知机模型为了应对线性可分二分类问题而设计的算法,求得一个超平面S使得所有数据能正确分类. 即使得每个数据都 f ( x ) = s ...
- PLA算法(机器学习基石)
PLA算法的机制 故事起源于一个二元分类问题(比如说银行要不要给客户发信用卡的问题) 我们的先决条件 1.我们有资料在手上(用户信息) 2.我们的资料有标签(有没有发信用卡) 3.假设我们的资料是线性 ...
- java实现一个感知机_感知机学习算法Java实现
感知机学习算法Java实现. Perceptron类用于实现感知机, 其中的perceptronOriginal()方法用于实现感知机学习算法的原始形式: perceptronAnother()方法用 ...
最新文章
- 关于easyui中的editIndex
- sqlite数据库android使用教程,Android开发教程之 SQLite数据库的使用
- boost::detail::lexical_cast_stream_traits用法的测试程序
- Python攻克之路-网络编程(文件上传实现思路)
- 500张思维导图记38000单词_思维导图记单词,环环相扣难遗忘——2020奇速英语夏令营第三天...
- python tkinter数据库通讯录_TKINTER--GUI连接数据库登陆
- Qt文档阅读笔记-Qt工作笔记-QThread解析与实例(主线程发送信号给子线程)
- php对键盘控制,键盘控制 - 陈映亮的个人空间 - OSCHINA - 中文开源技术交流社区...
- [转载] python机器学习第三章:使用scikit-learn实现机器学习分类算法
- PHP中去除换行解决办法小结(PHP_EOL)
- XP系统装python
- 小程序调用百度api实现图像识别
- 【入门必看-算法基础知识讲解】小白都也能看得懂
- GNSS螺旋天线高精度定位
- linux电脑外放没声音,ubuntu 16.04安装好后没声音的解决方法
- python exe文件反编译_[原创]python exe文件解包方法总结
- Markdown流程图
- java+mysql基于SSM的班级管理系统#毕业设计
- 智力题——1红蓝墨水
- STM32单片机接直流减速电机编码器注意点
热门文章
- day12【过渡】SpringCloud
- linux nona怎么用_Linux nano编辑器命令常用方法
- android go 刷机教程,安卓用的久了,如何刷机?安卓手机线刷教程
- php ds扩展,PHP教程:老生常谈PHP中的数据结构:DS扩展
- bwl老二吃嘲讽吗_怀旧服BWL2小时全通最简打法!时光点燃一次过
- 自实现进程管理器linux,【Linux工具篇】supervisor进程管理器
- Spring MVC上传文件后重命名读取不显示,报错已解决(The origin server did not find a current representation for the targe)
- greenplum数据导入到mysql,将数据从DB2数据库传输到greenplum数据库
- 广东机电职业技术学校计算机怎么样,广东机电职业技术学院宿舍怎么样 住宿条件好不好...
- springboot 获取web服务端口_我是这样使用SpringBoot(WEB服务)