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

废话不多说,最近上台湾大学的ML课程,说到PLA(perception learning algorithm)算法,涉及到ML的一个入门算法,我花了一些时间消化整理,在这里跟大家分享一下,希望大家再回过头去看台湾大学ML课程的时候,能更加如鱼得水。

算法具体如下:

PLA是一种能够通过自己学习而不断改进的分类算法,可将二维或者更高维的数据切分成对应不同的种类(1和-1),假设我们有n个数据样本,每个数据样本对应的维度为m,可以表示成如下:

对于每个样本,其对应的类别为1或-1,可表示为如下:

我们假设一条直线:

其对应为样本m个维度的系数,这里需要注意的是,我们的目标是求解出W的值,将对应的两种类别很好地分开,而不是在样本中做回归求误差最小。

所以我们的目标是使下面式子成立:

其中sign是符号函数,对于所有的正数,返回1,对于所有非正数返回-1.

可以通过将表示为而化简上市,其中,则有如下:                                                                                                   (1)

实际过程中上述等式可能没办法在一开始就成立,所以当等式不成立的时候,我们需要某种方法来修正过程中的W参数,下面举个栗子:

比如我们计算出来:      是正的,而却是负的,从某种意义上来说,W参数是偏大的;而当是负的,而对应的却是正的,那么W参数是偏小的,那么,我们该如何调整W参数呢?

可以通过如下:

这样我们就可以通过将对应的W参数自主学习调整为越来越靠近正确的W。

也许你会问,为什么这样通过修改W最后一定会收敛?或者换个说法,为什么通过这样不断地变化W参数,最后一定会有一条直线能将样本较好地分开呢?

下面我会证明上面这个问题,也就是证明PLA算法的收敛性:

假设存在一条直线能将我们样本数据很好分类,那么则有:

该式对应上文式(1),这里我通过向量表示消除符号过多的问题。

为了证明W会朝着靠拢,我们可以构造如下式子:

                                                                                                   (2)

其中我们上文以及假设是正确的分类线,那么意味式(2)中

则算法在每次迭代修改W时,,那么从向量内积的角度来看,这意味着两个向量越来越靠近。

也许你还会问,两个向量内积越来越大,除了角度变小的可能外,还有两个向量越来越大的可能?

下面我会证明其实在W参数学习的过程中其单位长度在不断变小:

其中我们已经知道符号相异,那么

则在W自主学习的过程中,其模越来越小,而上述式(2)我们证明了越来越大,那么综合只有当向量的角度越来越小时,式(2)才会成立,所以我们证明了自主学习,W会朝着越来越正确的方向变动(即使有时候这种变动我们察觉不出)。

PLA算法在多维度分类效果也比较好,收敛速度很快,这里博主用的是双维度样本,该样本在更新1400多次后输出了对应的结果,代码质量还有待改进。

下面是算法的实现(R语言)

#加载ggplot2包

library(ggplot2)

library(plyr)

#PLA数据,取R自带数据集iris,确保直线下方数据标签为-1

pladata <- data.frame(x1=iris[1:100,1],x2=iris[1:100,2],y=c(rep(1,50),rep(-1,50)))

ggplot(data=pladata,aes(x1,x2,col=factor(y)))+geom_point()     #样本数据展示

#PLA函数,x表示样本数据,y为对应类别,initial为w初始值,delta为相对误差率

PLA <- function(x,y,initial,delta){

w <- initial;n <- length(y);

x <- as.matrix(cbind(x0=rep(1,dim(x)[1L]),x))

error <- 1

while(error > delta){

if(all(sign(x %*% w)==y)){

error <- 0

}else{

xnt <- which(sign(x %*% w)!=y)

w <- w + x[xnt[1],] * rep(y[xnt[1]],dim(x)[2L])

xnt1 <- which(sign(x %*% w)!=y)

error <- length(xnt1)/n

}

}

names(w) <- paste("w",0:(dim(x)[2L]-1),sep="");print(w);

}

w <- PLA(x=pladata[,1:2],y=pladata[,3],initial=c(1,0,0),delta=0)

#分类结果展示:

names(w) <- NULL

ggplot(data=pladata,aes(x1,x2,col=factor(y)))+

geom_point()+

geom_abline(aes(intercept=(-w[1]/w[3]),slope=(-w[2]/w[3])))

其中未分类前的散点图如下:

通过自主学习训练后的结果如下:

C++代码实现

/*<span style="font-family:Times New Roman;">

Author: DreamerMonkey

Time : 5/3/2015

Title : PLA Algorithm

*/

#include<iostream>

#include<vector>

using namespace std;

//以二维空间为例,x1 x2为属性

struct Item{

int x0;

double x1,x2;

int label;

};

//权重结构体,w1 w2为属性x1 x2的权重,初始值全设为0

struct Weight{

double w0,w1,w2;//

}Wit0={0,0,0};

//符号函数,根据向量内积和的特点判断是否应该发放信用卡

int sign(double x){

if(x>0)

return 1;

else if(x<0)

return -1;

else return 0;

}

//两个向量的内积

double DotPro(Item item,Weight wight){

return item.x0*wight.w0+item.x1*wight.w1+item.x2*wight.w2;

}

//更新权重

Weight UpdateWeight(Item item,Weight weight){

Weight newWeight;

newWeight.w0=weight.w0+item.x0*item.label;

newWeight.w1=weight.w1+item.x1*item.label;

newWeight.w2=weight.w2+item.x2*item.label;

return newWeight;

}

int main(){

vector<Item> ivec;

Item temp;

cout<<"Please input Item.x1-Item.x2;"<<endl;

while(cin>>temp.x1>>temp.x2>>temp.label){

temp.x0=1;

ivec.push_back(temp);

}

Weight wit=Wit0;

for(vector<Item>::iterator iter=ivec.begin();iter!=ivec.end();++iter){

if((*iter).label!=sign(DotPro(*iter,wit))){

wit=UpdateWeight(*iter,wit);

iter=ivec.begin();//在从头开始判断,因为更新权重后可能会导致前面的点出故障,需要从头再判断

}

}

//打印结果

cout<<wit.w0<<" "<<wit.w1<<" "<<wit.w2<<" "<<endl;</span>

}

matlab代码实现


x_1=[120 185 215 275 310 337];

x_2=[110 125 185 250 130 137];

plot(x_1,x_2,'ob','linewidth',3,'markersize',15);

hold on;

x1=[55 98 115 110 95 122 70 205 225 ];

y1=[90 178 170 225 270 270 310 345 290 ];

plot(x1,y1,'xr','linewidth',3,'markersize',15)

hold on;

negpoints = [55,90,-1;310,130,1;98,178,-1;115,110,1;115,165,-1;185,125,1;110,225,-1;215,185,1;95,270,-1;275,260,1;122,270,-1;70,310,-1;337,137,1;205,345,-1;225,280,-1]

pospoints = [310,130,-1;115,110,-1;185,125,-1;215,185,-1;275,260,-1;337,137,-1]

weight = [0,300,100]

H_value = 0

sig=true

axis([50 350 50 350])

while sig

for i=1:1:15

sig=false

q = sign(negpoints(i,3))

h_x_i = sign(weight(1)+weight(2)*negpoints(i,1)+weight(3)*negpoints(i,2))

if h_x_i == q

if (i==15 && sig==false )

x =[50,100,200,250,350]

y = -(weight(2)/weight(3))*x -( weight(1)/weight(3))

plot(x,y,'b');

hold on;

else

continue

end

else

sig=true

ew1 = weight(2)

ew2 = weight(3)

weight(1)= (weight(1)+ q*1)

weight(2)= (weight(2)+ q*negpoints(i,1))

weight(3)= (weight(3)+ q*negpoints(i,2))

x =[50,100,200,250,350]

x1 =[50,100,200,250,350]

y1 = (weight(3)/weight(2))*(x1-200) +200

plot(x1,y1,'b');

hold on;

y = -(weight(2)/weight(3))*x -( weight(1)/weight(3))

plot(x,y,'r');

hold on;

end

end

end


转载于:https://blog.51cto.com/6510827/1854839

PAL算法原理及代码实现相关推荐

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

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

  2. 多类线性分类器算法原理及代码实现 MATLAB

    多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...

  3. SSD算法原理与代码(三)

    说明:这几篇文章是讲解SSD,从算法原理.代码到部署到rk3588芯片上的过程.环境均是TF2.2,具体的安装过程请参考网上其他的文章. 一.SSD简介 SSD算法是一个优秀的one-stage目标检 ...

  4. 计算机图形学--中点椭圆算法原理及代码实现

    目录 椭圆的几何特性: 算法原理: 代码实现: 说明,我们这里讨论的椭圆都是对称轴平行于坐标轴的椭圆,对于其他方程较为复杂的椭圆我们不做讨论. 椭圆的几何特性: 首先我们考虑椭圆的几何特性.椭圆是抽对 ...

  5. 论文|Node2vec算法原理、代码实战和在微信朋友圈的应用

    1 概述 Node2vec是2016年斯坦福教授 Jure Leskovec.Aditya Grover提出的论文,论文的下载链接为:https://arxiv.org/pdf/1607.00653. ...

  6. 深度强化学习-D3QN算法原理与代码

    Dueling Double Deep Q Network(D3QN)算法结合了Double DQN和Dueling DQN算法的思想,进一步提升了算法的性能.如果对Doubel DQN和Duelin ...

  7. 萤火虫算法_40多种智能优化算法原理和代码分享

    40多种智能优化算法原理和代码分享 <智能优化算法讲解>PDF下载地址: <智能优化算法原理讲解>PDF​mianbaoduo.com 包括: 1.海鸥算法SOA 智能优化算法 ...

  8. HoughCircle(霍夫圆)算法原理及代码实现

      此算法建立在Canny算法的基础上,对Canny算法检测出的边缘图像进行拟合,因此要用到Canny算法返回的边缘图像及梯度方向矩阵.Canny算法相关内容详见上一篇博客:Canny边缘检测算法原理 ...

  9. 深度强化学习-Double DQN算法原理与代码

    深度强化学习-Double DQN算法原理与代码 引言 1 DDQN算法简介 2 DDQN算法原理 3 DDQN算法伪代码 4 仿真验证 引言 Double Deep Q Network(DDQN)是 ...

最新文章

  1. 数据有价——数据资产定价研究初探
  2. 【alibaba-cloud】Gateway网关
  3. amvu mysql_mysql--数据库备份
  4. java手写实现BST
  5. 计算机支持协同工作不是多媒体应用,计算机支持的协同工作概观.PDF
  6. python连接数据库设置编码_python操作mysql中文显示乱码的解决方法
  7. 定时器Timer和播放器MediaPlayer
  8. STM32的GPS数据提取程序设计说明——基于NMEA0183协议
  9. 无线打印 airprint 服务器,怎么设置普通打印机也能airprint无线打印
  10. android系统体系结构,Android系统的五层体系结构解析
  11. AudioToolbox之AudioQueue.h(二)Creating and Disposing of Audio Queues
  12. Word写作 | 如何在Word中把图片铺满整个页面
  13. python 白色怎么表示_在numpy中创建“白色”图像(2D图像)
  14. 做一名有幸福感的计算机教师,做一名有职业幸福感的教师为题目的作文
  15. 暗金色 rgb_杜伽TAURUS K310樱桃RGB红轴体验:做工精良、手感优秀
  16. flask_restful中的输出域(Resource、fields、marshal、marshal_with)
  17. python两张图片无缝合成一张_Python将多张图片进行合并拼接
  18. 【BZOJ4327】JSOI2012 玄武密码 AC自动机
  19. 学习C++编程的必备软件
  20. C语言判断一个五位数是不是回文数

热门文章

  1. B-Tree索引在sqlserver和mysql中的应用
  2. 中级.NET开发人员
  3. windows核心编程-第一章 对程序错误的处理
  4. 【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | exec_utils.cc 中执行 Dex 编译为 Oat 文件的 Exec 和 ExecAndReturnC函数 )
  5. 【开发环境】Mac 中安装 Python3 最新版本 ( 下载 Python 最新版本 | 安装 Python3 | 验证 Python3 )
  6. 【Android应用开发】RecycleView API 翻译 (文档翻译)
  7. centos 6.2用yum安装中文输入法
  8. 第八届蓝桥杯省赛第二题---等差素数列
  9. C#文件夹权限操作工具类
  10. 线程同步monitor