转自: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. 扩展方法和Lambda之练习手记

    扩展方法是我们日常开发当中所经常简化代码,提高性能和代码可读性的一个重要开发手段. 扩展方法是一个只能在静态类中声明的静态方法 Lambda 是一个表达式 ,学会了 可以使代码简洁,也是装13的利器. ...

  2. 异常处理----使用 try…catch…finally 处理异常

    使用 try…catch…finally 处理异常 异常处理是通过try-catch-finally语句实现的. try { ...... //可能产生异常的代码 } catch( Exception ...

  3. 有人问thinkphp的标签解析的时候为什么出现标签内内容空格丢失

    举例如下 该代码被解析后 变为 并不是  active li bg  这里面的空格没有了 我试了多次,确实是这样,后来想了想 应该是框架解析的时候自动处理了,然后找了找框架代码 Template.cl ...

  4. ios开发之--iOS 11适配:iOS11导航栏返回偏移

    UIBarButtonItem 左边间隙过大,解决方案(ios11之前): 调用下面的方法,设置negativeSpacer.width = -15;就可以解决间隙过大的问题: UIBarButton ...

  5. swift - UIStepper的用法

    在网上查看学习资料的时候,看到有这个控件,所以就自己写了下,感觉在某些特定的地方用的还是挺方便的! 不过,个人感觉,局限性太大! 1.初始化(创建个label是为了让大家看到具体的数值) let st ...

  6. ArcGIS ArcPy Python处理数据

    1.使用搜索游标查看行中的字段值.import arcpy # Set the workspace arcpy.env.workspace = "c:/base/data.gdb" ...

  7. /etc/redhat-release

    该文件用于记录 RedHat 的发行版本信息 [root@localhost ~]$ cat /etc/redhat-release CentOS release 6.5 (Final)

  8. 华为P10闪存门

    随着余承东的倡议书以及五一假期3天的时间冲刷,华为的闪存门事件,似乎被冲淡了.但相信还有很多人对华为“闪存门”的起始及发展过程不是特别了解.而华为作为2017年Q1季度手机出货量的冠军,居然在4月份出 ...

  9. 测试sql语句性能,提高执行效率

    为了让您的程序执行的效率更高,SQL的效率一定不可忽视. 现有以下方法去检测SQL的执行效率. 对于多表查询的效率测试: )直接from ,where方式. SET STATISTICS io ON ...

  10. (转)关于android设备管理器的一些分析

    转自http://bbs.pediy.com/showthread.php?t=183692 想必很多人都知道轰动一时android木马OBAD,该木马利用android设备管理器的漏洞,当用户激活设 ...