基于R多元统计分析——判别分析(附代码)

一、背景

        判别分析是在已知样品分类的前提下,将给定新样品按照某种分类判入某类的分析方法。

距离判别

d\left ( x,y \right )=\sqrt{({x-y})'\varepsilon ^{-1}(x-y)}

其中\varepsilon是x,y随机向量的协方差矩阵。马氏距离的作用在于消除了变量单位不一致的影响更加合理。当两个总体的协方差不同时应使用二次判别。

FISHER判别

将高维的点投影到一条直线y上,使G1和G2中的点在y上的投影靠近而彼此之间分开

Bayes判别

假定对研究对象有一定的认识,可以用先验概率描述,样本的作用在于修正已有的先验概率分布得到后验分布,再通过后验分布进行各种统计推断。其判别准则是以个体归属某类的概率最大或错判总平均损失最小为标准。

接下来以今天和昨天的湿温差和气温差为预报明天是否下雨的重要因子,分别应用三种方法。

二、距离判别的代码实现

setwd("C:/Users/myq20170530/data")
data5.2<-read.csv("ex5.2.csv",heading=1)
classG1=data5.2[1:10,2:3]
classG2=data5.2[11:20,2:3]##分别提取不同类别的样本数据
newdata=c[8.1,2.0]##需要预测的数据点
mu1<-colMeans(classG1)
mu2<-colMeans(classG2)
S1<-var(classG1)
S2<-var(classG2)
##通过判断S1,S2不同可设定距离计算函数如下
W2unequal=funciton(x,mu1,mu2,S1,S2)mahalanobis(x,mu2,S2)-mahalanobis(x,mu1,S1)
W2unequal(x,mu1,mu2,S1,S2)
>[1] 3.40664 #结果说明该点位于第一类

三、Fisher判别的代码实现

##利用MASS程序包中现行判别函数lda()作判断
>attach(data5.2)
>library(lda)
>ld=lda(G~x1+x2)
>ld
Call:
lda(G ~ x1 + x2)

Prior probabilities of groups:
  1   2 
0.5 0.5 

Group means:
     x1   x2
1  0.92 2.10
2 -0.38 8.85

Coefficients of linear discriminants:
          LD1
x1 -0.1035305
x2  0.2247957


#对原始数据进行回判分类,从而对比输出结果和原始数据真实分类考察误差大小
> Z=predict(ld)
> newG=Z$class#newG是回判类别
> cbind(G,newG,Z$post)
#用table()函数对比整体判别情况
> tab=table(newG,G)
> tab


##预判
> newdata=data.frame(x1=c(8.1),x2=c(2.0))
> (predict(ld,newdata))
$class #列出新样品的判别分类
[1] 1
Levels: 1 2

$posterior #列出判别后验概率
          1          2
1 0.9327428 0.06725717

$x #对应线性判别函数的值
        LD1
1 -1.591809

从结果可以看出,对20个原始数据中,只有2个判别错误,误判率为10%,若需要预测的测量量为(8.1,2.0),可利用predict()对他们的品种进行判别。结果表明改观测值属于1类,注意对应的后验概率与1接近

四、Bayes判别

> ld=lda(G~x1+x2,prior=c(6,8)/14) #利用先验概率线性判别
> ld
Call:
lda(G ~ x1 + x2, prior = c(6, 8)/14)

Prior probabilities of groups:
        1         2 
0.4285714 0.5714286 

Group means:
     x1   x2
1  0.92 2.10
2 -0.38 8.85

Coefficients of linear discriminants:
          LD1
x1 -0.1035305
x2  0.2247957

#利用predict对原始数据回判分类
> Z=predict(ld)
> newG=Z$class
> cbind(G,newG,Z$post,Z$x)
> tab=table(G,newG)
> tab
   newG
G   1 2
  1 8 2
  2 1 9
> sum(diag(prop.table(tab)))
[1] 0.85

##对待判样本进行判定
>prenew=predict(ld,newdata=newdata)
>prenew
$class
[1] 1
Levels: 1 2

$posterior
          1          2
1 0.9122901 0.08770985

$x
        LD1
1 -1.709806

程序输出说明,第一组中6号和10号被判错,第二组中15号被判错,回判正确率为85%

Bayes判别和前。面判别法的结果相同

五、后记

        在本例中Bayes判别法的正确率没有前两者高。在实际过程中,前两种判别法计算简单易于操作,但其局限在于判别方法和总体个字出现的概率大小无关且判别方法与错判之后造成的损失无关。而Bayes判别法可以一定程度上。解决上述的问题。对于三种判别法的数学原理在本章中不详细叙述,具体推导在未来的文章中有缘再会。

        本文为笔者自行学习整理所得,若有不对还请温和批评指正。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值