你好,游客 登录
背景:
阅读新闻

R语言与数据分析之三:分类算法1

[日期:2014-12-12] 来源:CSDN博客  作者:HowardGe [字体: ]

    分类算法与我们的生活息息相关,也是目前数据挖掘中应用最为广泛的算法,如:已知系列的温度、湿度的序列和历史的是否下雨的统计,我们需要利用历史的数据作为学习集来判断明天是否下雨;又如银行信用卡诈骗判别。

    分类问题都有一个学习集,根据学习集构造判别函数,最后根据判别函数计算我们所需要判别的个体属于哪一类的。

    常见的分类模型与算法

    传统方法

    1、线性判别法;2、距离判别法;3、贝叶斯分类器;

    现代方法:

    1、决策树;2、支持向量机;3、神经网络;

线性判别法:

    天气预报数据(x1,x2分别为温度和湿度,G为是否下雨)

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. G=c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2) 
  2. x1=c(-1.9,-6.9,5.2,5.0,7.3,6.8,0.9,-12.5,1.5,3.8,0.2,-0.1,0.4,2.7,2.1,-4.6,-1.7,-2.6,2.6,-2.8) 
  3. x2=c(3.2,0.4,2.0,2.5,0.0,12.7,-5.4,-2.5,1.3,6.8,6.2,7.5,14.6,8.3,0.8,4.3,10.9,13.1,12.8,10.0) 
  4. a=data.frame(G,x1,x2) 
  5. plot(x1,x2) 
  6. text(x1,x2,G,adj=-0.5) 

 

      观察上图可以1点分布在右下方区域,2点主要分布在上方区域,肉眼可见这两个集合分离的比较明显,线性判别法的原理就是在平面中找出一条直线,使得属于学习集1号的分布在直线一侧,属于学习集2号的分布在直线另一侧。

    判别式是允许有出差的,只要在一定的范围内即可。

    R语言的表达如下

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. library(MASS) 
  2. ld=lda(G~x1+x2) 
  3. z=predict(ld) 
  4. newG=z$class 
  5. y=cbind(G,z$x,newG) 

    由上左图可以看出,首先计算先验概率,数据中12各占50%,然后计算x1x2的平均值,最后给出了判别函数的代数表达:

 

    观察上右图可见,newG为预测的判别,可见两类分别只有一个判错,同时可以见判别函数的值为正值时判为第2类,判别函数值为负值时判为第1类。

距离判别法

    计算待测点和各类的距离,选择最近的分类进行归类。其中距离的计算非常关键,常见的距离为马氏距离:


      R语言没有自动距离判别法的函数,我们需要自己手动写:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. myDiscriminiant<- function(TrnX1,TrnX2,TstX =NULL,var.equal=FALSE) 
  2.     if(is.null(TstX)==TRUE) TstX <- rbind(TrnX1,TrnX2) 
  3.     if(is.vector(TstX)==TRUE) TstX<- t(as.matrix(TstX)) 
  4.     else if(is.matrix(TstX) !=TRUE) 
  5.         TstX <- as.matrix(TstX) 
  6.     if(is.matrix(TrnX1)!=TRUE) TrnX1 <- as.matrix(TrnX1) 
  7.     if(is.matrix(TrnX2)!=TRUE) TrnX2 <- as.matrix(TrnX2) 
  8.     nx <- nrow(TstX) 
  9.     blong <- matrix(rep(0,nx),nrow=1,byrow=TRUE,dimnames=list("blong",1:nx)) 
  10.     mu1 <-colMeans(TrnX1);mu2 <- colMeans(TrnX2) 
  11.     if(var.equal==TRUE || var.equal==T){ 
  12.         S<- var(rbind(TrnX1,TrnX2)) 
  13.         w<- mahalanobis(TstX,mu2,S)-mahalanobis(TstX,mu1,S) 
  14.     } 
  15.     else{ 
  16.         S1<-var(TrnX1);S2<-var(TrnX2) 
  17.         w<-mahalanobis(TstX,mu2,S2)-mahalanobis(TstX,mu1,S1) 
  18.     } 
  19.     for(i in 1:nx){ 
  20.         if(w[i]>0)   
  21.             blong[i] <- 1 
  22.         else 
  23.             blong[i] <- 2     
  24.     } 
  25.     blong 

 保存到当前空间后,在控制台调用它:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. classX1 <- data.frame( 
  2.             x1=c(6.6,6.6,6.1,6.1,8.4,7.2,8.4,7.5,7.5,8.3,7.8,7.8), 
  3.             x2=c(39,39,47,47,32,6,113,52,52,113,172,172), 
  4.             x3=c(1,1,1,1,2,1,3.5,1,3.5,0,1,1.5) 
  5.  ) 
  6.  classX2 <- data.frame( 
  7.             x1=c(8.4,8.4,8.4,6.3,7,7,7,8.3,8.3,7.2,7.2,7.2,5.5,8.4,8.4,7.5,7.5,8.3,8.3,8.3,8.3,7.8,7.8), 
  8.             x2=c(32,32,32,11,8,8,8,161,161,6,6,6,6,113,113,52,52,97,97,89,56,172,283), 
  9.             x3=c(1,2,2.5,4.5,4.5,6,1.5,1.5,0.5,3.5,1.0,1.0,2.5,3.5,3.5,1,1,0,2.5,0,1.5,1,1)   
  10. source("myDiscriminiant.R") 
  11. myDiscriminiant(classX1,classX2,var.equal=TRUE) 

    观看blong就可以看出个体属于哪一分类


 

贝叶斯分类器:

    计算个体属于所有分类的概率,根据概率大小选择所属分类,已两个总体总体的判别情况来看,X1X2分别具有概率密度函数f1(x)f2(x),则样本实际来自X1却误判为X2的概率为:


    同样来自X2却误判为X1的概率简单转换下即可;

    来自X1也被判为X1的概率为:


    来自X2也被判为X2的也类似

    p1,p2分别表示X1X2的先验概率,则


    L(1|2)表示X2被误判为X1的损失,其他类似,为了是分类越准确,则需降低平均误判损失(expected cost of misclassification:ECM)越小越好:


    上式便为Bayes版别式。

    按照上述数学推导,我们构建自己的两个总体的Bayes判别程序:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. myBayes <- function(TrnX1,TrnX2,rate=1,TstX=NULL,var.equal=FALSE){ 
  2.     if(is.null(TstX)==TRUE) TstX<-rbind(TrnX1,TrnX2) 
  3.     if(is.vector(TstX)==TRUE) TstX<-t(as.matrix(TstX)) 
  4.     else if(is.matrix(TstX)!=TRUE) 
  5.         TstX <- as.matrix(TstX) 
  6.     if(is.matrix(TrnX1)!=TRUE) TrnX1 <- as.matrix(TrnX1) 
  7.     if(is.matrix(TrnX2)!=TRUE) TrnX2 <- as.matrix(TrnX2) 
  8.     nx <- nrow(TstX) 
  9.     blong <- matrix(rep(0,nx),nrow=1,byrow=TRUE,dimnames=list("blong",1:nx)) 
  10.     mu1 <-colMeans(TrnX1);mu2 <- colMeans(TrnX2) 
  11.     if(var.equal==TRUE || var.equal==T){ 
  12.         S<- var(rbind(TrnX1,TrnX2)) 
  13.         w<- mahalanobis(TstX,mu2,S)-mahalanobis(TstX,mu1,S) 
  14.     } 
  15.     else{ 
  16.     S1<-var(TrnX1);S2<-var(TrnX2) 
  17.     beta <-2*log(rate)+log(det(S1)/det(S2)) 
  18.     w<-mahalanobis(TstX,mu2,S2)-mahalanobis(TstX,mu1,S1) 
  19.     } 
  20.     for(i in 1:nx){ 
  21.         if(w[i]>beta)   
  22.             blong[i] <- 1 
  23.         else 
  24.             blong[i] <- 2 
  25.     } 
  26.     blong 

    以天气预报为案例,我们看看如何使用Bayse分类器:


 我们在控制台录入数据:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. TrnX1<- matrix( 
  2.     c(24.8,24.1,26.6,23.5,25.5,27.4, 
  3.         -2,-2.4,-3,-1.9,-2.1,-3.1), 
  4.     ncol=2) 
  5. TrnX2<-matrix( 
  6.     c(22.1,21.6,22,22.8,22.7,21.5,22.1,21.4, 
  7.         -0.7,-1.4,-0.8,-1.6,-1.5,-1,-1.2,-1.3), 
  8.     ncol=2) 
  9. source("myBayes.R") 
  10. myBayes(TrnX1,TrnX2,rate=8/6) 

下图可见所有的样本全部判别正确:

原文链接:http://blog.csdn.net/howardge/article/details/41800091





收藏 推荐 打印 | 录入: | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款