1.PLA算法
作为机器学习的入门基础算法,主要是要理解其产生由来。感知机模型为了应对线性可分二分类问题而设计的算法,求得一个超平面S使得所有数据能正确分类。
即使得每个数据都 f ( x ) = s i g n ( w ⋅ x + b ) f(x)=sign(w\cdot x+b) f(x)=sign(w⋅x+b)
然而这个数学问题无法优化,因此转化为求错误分类的代价函数的最小值
m i n L ( w ) = ∑ x i = M k − y i ( w ⋅ x i + b ) minL(w) =\sum_{x_i=M}^{k} -y_i(w\cdot x_i+b) minL(w)=xi​=M∑k​−yi​(w⋅xi​+b)
其中有两个注意的点:

  1. (xi,yi)是分类错误的点,也就是说其本质是有错误点驱动的优化函数,对于可线性分类数据总存在一个超平面S使得L(w)为0,对于无法线性可分数据也能找出分类错误最少的超平面
  2. 有高数知识可知,要求的函数最小值即在其梯度方向寻找,损失函数L(w)关于w求导可知其导数为 m i n L ( w ) ′ = ∑ x i = M k − y i x i minL(w)' =\sum_{x_i=M}^{k} -y_i x_i minL(w)′=xi​=M∑k​−yi​xi​
    即每次w更新应在梯度方向上更新为 w i + 1 = w i + y i ⋅ x i ( 旋 转 ) w_{i+1}=w_i+y_i\cdot x_i(旋转) wi+1​=wi​+yi​⋅xi​(旋转)
    b i + 1 = b i + y i ( 平 移 ) b_{i+1}=b_i+y_i(平移) bi+1​=bi​+yi​(平移)

2.收敛性
关于收敛性的证明过程如下:

对上面证明过程进行补充:

3.算法实现
以numpy生成两类正态数据,再对其标记,最后使用PLA算法进行分类,并用matplotlib显示分类效果

from matplotlib import pyplot as plt
import numpy as np#生成训练数据
def generate_data(u1,o1,u2,o2,n,m):#此产生两组正态分布数据(产出为元组数据)t1=np.random.normal(u1,o1,size=(n,2))t2=np.random.normal(u2,o2,size=(m,2))a_x=np.array(t1)b_x=np.array(t2)#给两组正态数据打标签a_y=np.ones(n)b_y=np.negative(np.ones(m))class1=np.c_[a_x,a_y]class2=np.c_[b_x,b_y]return class1,class2
#pla算法实现
def pla():w=np.zeros(3)#初始化w0n=50#正类数据量m=50#负类数据量c1,c2=generate_data(2,1,-2,1,n,m)test=np.vstack((c1,c2))#合并两类数据,将c1类与c2类合并为同一二维矩阵x0=np.ones(m+n)test=np.c_[x0,test]#插入列向量x0=[1,1,...,1],实现w=[b,w1,w2] * x[1,x1,x2]cnt=0while True:cnt+=1if cnt>1000:print('非线性可分数据')breaksuccess=Truefor i in range(len(test)):x=np.array(test[i][:-1])y=np.dot(x,w)if np.sign(y)==np.sign(test[i][-1]):continuew=w+test[i][-1]*x #更新w值success = Falsebreakif success==True:break#绘制分类前效果plt.scatter(c1[:, 0], c1[:, 1], c='r', marker='o')  # 正类正态分布plt.scatter(c2[:, 0], c2[:, 1], c='b', marker='x')  # 负类正态分布plt.show()#绘制分类后效果x=np.linspace(min(test[:,1])-1,max(test[:,2])+1,50)y=-w[1]/w[2]*x-w[0]/w[2]   #见下文数学推导plt.plot(x,y,c='g')#超平面plt.scatter(c1[:, 0], c1[:, 1], c='r',marker='o')  # 正类正态分布plt.scatter(c2[:, 0], c2[:, 1], c='b',marker='x')  # 负类正态分布plt.show()return cnt,wif __name__=='__main__':cnt,w=pla()print("迭代次数:",cnt)print("超平面法向量:",w)

其中由法向量推超平面直线推导:
已知超平面为 W ⋅ X = 0 {\rm W\cdot X=0} W⋅X=0,其中 X {\rm X} X为二维向量,即x,y轴
W ⋅ X = W ⋅ ( x , y ) = ( b , w 1 , w 2 ) ⋅ ( 1 , x , y ) = b + w 1 x + w 2 y = 0 {\rm W\cdot X= W\cdot(x,y)=(b,w_1,w_2)\cdot(1,x,y)=b+w_1x+w_2y=0} W⋅X=W⋅(x,y)=(b,w1​,w2​)⋅(1,x,y)=b+w1​x+w2​y=0,则直线表达式为: y = − w 1 w 2 x − b w 2 {y=-\frac{w_1}{w_2}x-\frac{b}{w_2}} y=−w2​w1​​x−w2​b​
注: b {b} b为代码中的w[0], x {x} x为test的第二列, y {y} y为tes的第三列

4.分类效果展示
其算法分类效果如下:
分类前:

分类后:

PLA算法实现与展示相关推荐

  1. pla算法 matlab,PAL算法原理及代码实现

    博主发现之前写的博客都是偏程序方面,而较少涉及数学或算法方面的东西,其实无论什么软件工具,最终都是为了更好地给理论铺路搭桥,所以我觉得不应该就某个程序贴个博客,而是在实际算法研究中,将理论描述清晰,再 ...

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

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

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

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

  4. 计算机基础数据结构和算法动态可视化展示网站收录

    计算机中有很多数据结构.算法对于小白来说非常难理解,交互式动画一步步展示整个过程可以帮助我们快速准确地理解这些算法.我们整理了12个可动态交互和展示常见数据结构和排序.图算法等网站,总计12个 收录到 ...

  5. python实现KNN算法并可视化展示

    话不多说,直接上代码,本代码采用的是鸢尾花数据集,来实现KNN算法 import matplotlib.pyplot as plt import matplotlib as mpl import pa ...

  6. VB实现6大排序算法---动态过程展示(建议收藏)

    VB实现6大排序算法:插入排序.基数排序.快速排序.希尔排序.选择排序.归并排序.可以随机生成指定个数的数据,显示排序过程,给出排序结果,计算排序算法消耗的时间. 生成随机数: 排序结果: 插入排序: ...

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

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

  8. Visualizations:一个数据结构和算法的可视化展示网站

    " 美国旧金山大学计算机科学系网站里,提供了演示多种数据结构和算法的可视化演示,可以自由访问,也可以打包下载到本地." 偶然的机会,发现了这个网站,里面有常用的数据结构与算法的演示 ...

  9. 感知机PLA算法实现[转载]

    转自:https://blog.csdn.net/u010626937/article/details/72896144#commentBox 1.实现原始形式 import numpy as np ...

最新文章

  1. 互联网各大公司职级和薪资一览
  2. 深入剖析ThreadLocal
  3. Git每次推送时都会询问用户名
  4. 【转】Postman安装与使用
  5. 为了更高效的开发代码,这里列出了一些webstorm的快捷键和zencoding
  6. cocos2d-x游戏实例(27)-简易动作游戏(5)
  7. 在Ubuntu 16.04环境下安装Docker-CE(附视频教程)
  8. PTA10、统计字符个数 (10 分)
  9. 互斥锁Mutex:鸿蒙轻内核中处理临界资源独占的“法官”
  10. apache shiro怎么升级_Spring Boot 整合 Shiro ,两种方式全总结!
  11. RHEL6.3 NFS服务搭建过程详解
  12. python爬取歌词_利用Python网络爬虫抓取网易云音乐歌词
  13. 陈天桥:为何总是半夜惊醒?《前程密码》
  14. int转char数组_C语言学习第22篇---数组和指针的关系剖析
  15. 关于Tortoise git汉化包装了,不管用,仍然是英文菜单的问题记录
  16. Linux链表list_head/hlist_head/hlist_nulls_head的并发性
  17. 《System语言详解》——3. SystemTap脚本的各大组件
  18. cuda+cudnn安装(cudnn下载失败解决),环境配置以及遇到的问题记录!
  19. 谈谈坚持写博客的感悟
  20. 如何在linux下玩lol_英雄联盟新手教程 教你怎么玩lol

热门文章

  1. 如何在shell中编写mongodb的命令
  2. 整数转罗马数字 + 罗马数字转整数
  3. Linux | Ubuntu 使用 fdisk 无损分区拓容的方法
  4. Java局部变量和成员变量的区别
  5. Android8 手机配置,安卓8.0即将全面放开,配置再低的手机都能升级了!
  6. 关联规则算法(The Apriori algorithm)
  7. 数据仓库面试题整理超详细
  8. 三星R458笔记本使用ghost版后,无法调节亮度
  9. Spring Cloud 第十五天
  10. Android8.1 源码修改之通过黑名单屏蔽系统短信功能和来电功能