• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

PLA算法详解及实现(R语言)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

      废话不多说,最近上 台@@湾 大学的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])))

 

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

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




      如果有什么问题可以留言探讨哦。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
R语言数学表达式、特殊符号等发布时间:2022-07-18
下一篇:
R语言数据框行转列实例发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap