转自: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=x
self.y=y
self.w=np.zeros((x.shape[1],1))#初始化权重,w1,w2均为0
self.b=0
self.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)+b
return int(y) def update(self,label_i,data_i):
tmp=label_i*self.a*data_i
tmp=tmp.reshape(self.w.shape)#转换成w的形状。
#更新w和b
self.w=tmp+self.w
self.b=self.b+label_i*self.a def train(self):
isFind=False
while not isFind:
count=0
for 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+=1
self.update(self.y[i],self.x[i,:])#更新
if count==0:
print ('最终训练得到的w和b为:',self.w,self.b)
isFind=True
return self.w,self.b #画图描绘
class Picture:
def __init__(self,data,w,b):
self.b=b
self.w=w
plt.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 要生成的样本数,是一个array
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]#注意在此,把x0,x1当做两个坐标轴,把x1当做自变量,x2为因变量
return y def 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=x
self.y=y
self.w=np.zeros((1,x.shape[0]))#1行4列
self.b=0
self.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 gMatrix def sign(self,w,b,key):
y=np.dot(w*self.y,self.gMatrix[:,key])+b
return int(y) def update(self,i):
print(i,'@@@iii')
self.w[:,i]=self.w[:,i]+self.a
self.b=self.b+self.y[i]*self.a def cal_w(self):
w=np.dot(self.w*self.y,self.x)
return w def train(self):
isFind=False
while not isFind:
count=0
for 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+=1
self.update(i)
if count==0:
print ('最终训练得到的w和b为:',self.cal_w(),',',self.b)
print(self.w)
isFind=True
weights=self.cal_w()
return weights,self.b #画图描绘
class Picture:
def __init__(self,data,w,b):
self.b=b
self.w=w
plt.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 y def 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 np

x=[[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 np

x=[[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 1 print(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],否则会报错。

感知机PLA算法实现[转载]的更多相关文章

  1. 感知机学习算法(PLA)

    Perception Learning Algorithm, PLA 1.感知机 感知机是一种线性分类模型,属于判别模型. 感知机模型给出了由输入空间到输出空间的映射: f(X) = sign(WTX ...

  2. 【机器学习】感知机学习算法(PLA)

    感知机问题学习算法引入:信用卡问题 根据已知数据(不同标准的人的信用评级)训练后得出一个能不能给新客户发放信用卡的评定结果 解决该问题的核心思想扔为之前所讲到的梯度下降算法,对于更多条件的类似问题,首 ...

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

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

  4. 感知机学习算法 python实现

    参考李航<统计学习方法> 一开始的感知机章节,看着不太复杂就实现一下... """ 感知机学习算法的原始形式 例2.1 """ ...

  5. 机器学习真的可以起作用吗?(2)(以二维PLA算法为例)

    一个问题:大多数情况下,M(hypothesis set的大小)是无穷大的,例如PLA算法.那么是不是我们的原则1就不能使用了? 我们试着做一些努力: Step1:寻找hypothesis set的e ...

  6. [转]PLA算法总结及其证明

    PLA算法总结及其证明 http://m.blog.csdn.net/article/details?id=45232891 分类: 机器学习 PLA(Perception Learning Algo ...

  7. 机器学习理论基础学习3.1--- Linear classification 线性分类之感知机PLA(Percetron Learning Algorithm)

    一.感知机(Perception) 1.1 原理: 感知机是二分类的线性模型,其输入是实例的特征向量,输出的是事例的类别,分别是+1和-1,属于判别模型. 假设训练数据集是线性可分的,感知机学习的目标 ...

  8. 感知机学习算法Java实现

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

  9. Coursera台大机器学习基础课程学习笔记1 -- 机器学习定义及PLA算法

    最近在跟台大的这个课程,觉得不错,想把学习笔记发出来跟大家分享下,有错误希望大家指正. 一机器学习是什么? 感觉和 Tom M. Mitchell的定义几乎一致, A computer program ...

随机推荐

  1. ubuntu13.10更换源

    Ubuntu13.10更新源 不同的网络状况连接以下源的速度不同, 建议在添加前手动验证以下源的连接速度(ping下就行),选择最快的源可以节省大批下载时间. 首先备份源列表: sudo cp /et ...

  2. python2.0_day18_django_ORM

    Django_ORMday15\16我们学到的ORM都是最基本的增删改查.下面我们稍作升级,学习下高级点的增删改查.先创建一个新的APP项目 python3. manage.py startapp b ...

  3. mysql 小数处理

    1)四舍五入,保留小数 使用ROUND函数(注意不要使用FORMAT函数,FORMAT函数返回值带有逗号,赋值时会出现错误) 示例:保留两位小数 ROUND(price,2) 2)向上取整 CEIL ...

  4. Python pymysql 模块

    pymysql 是 Python3 连接 MySQL 的一个模块,常见用法如下: [root@localhost ~]$ pip3 install pymysql # 安装 pymysql 模块 In ...

  5. 如何在Oculus官网下载OculusSetup.exe(当前时间20170720)

    踩着免费的蓝灯FQ登录了Oculus官网,找了半天找不到哪里下载OculusSetup.exe,最后在最下面的支持中心找到了..... https://www.oculus.com/

  6. Spring学习笔记--Spring表达式语言SpEL

    Spring3引入了Spring表达式语言(Spring Expression Language,SpEL).SpEL是一种强大的.简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean ...

  7. MyEclipse 2016 CI修改web项目context-root

    右击项目properties——>搜索Deployment Assembly,修改如红框所示的Web Context Root

  8. 谷歌Volley网络框架讲解——HttpStack及其实现类

    前两篇已经对网络请求流程已经梳理了个大概,这次我们着重看一下HttpStack和它的其实现类.我们之前在Network篇讲过它仅有一个实现类,而今天我们讲的HttpStack有两个实现类. 其中Htt ...

  9. oracle 字段自增 两段代码搞定

    (这几天做了个小小课程设计时用的是oracle数据库,第一次用,发现oracle和我们以前用的sql server .mysql是有如此多不同的地方,下面是遇到的问题之一和解决方法,和大家分享下) 用 ...

  10. LightOJ 1348(Aladdin and the Return Journey )

    题目链接:传送门 题目大意:一棵无根树,每个点上有权值,两种操作,0 x y询问x~y路径上权值和 1 x y将 节点 x 权值变为y.对于询问操作输出答案. 题目思路:树链剖分 #include & ...