前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据分析 R语言实现】12.1判别分析及R实现

【数据分析 R语言实现】12.1判别分析及R实现

作者头像
统计学家
发布2019-04-10 10:41:54
3.6K1
发布2019-04-10 10:41:54
举报
文章被收录于专栏:机器学习与统计学

判别分析

判别分析是多元统计分析中较为成熟的一种分类方法,根据已知类别的若干样木数据,总结出客观事物分类的规律性,建立由数值指标构成的判别公式和判别准则。当遇到新的样本点时,只要根据总结出来的判别公式和判别准则,就能判别该样木点所属的类别。

12.1判别分析及R实现

在日常生活和工作实践中,我们常常会遇到判别分析问题,即根据已知归类的资料确定一种判别方法,建立由数值指标构成的分类规则即判别函数,然后把这样的规则应用到未知分类的样本中,判定一个新的样品应归属于哪一类。这些已知归类的来自k个总体的若干个样品称为“训练样品”。

判别分析是发现事物客观规律的方法,因此具有很强的实用性。例如在气象分析中,根据已有的气象资料如温度、气压等,来判断明天是晴天还是阴大、是否下雨;又如在植物学中,新发现的一种植物,根据其各方而特征判断它应属于哪一个科目等。

判别分析的方法有多种,常用的是距离判别法(马氏距离)、Fisher判别法和Bayes判别法。

12.1.1距离判别法

距离判别法的基本思想是根据样品x和总体G的距离来判断样品所属的总体。

12.1.2距离判别法的R实现

总体来讲,进行距离判别分析时只需要知道总体的数字特征(均值和协方差矩阵),而不涉及总体的分布函数。参数米知时可用样本的均值和1办方差矩阵来估计,简单实用,在R语言中实现起来也比较简.单。首先,我们介绍两个计算距离的函数。最常用的距离函数是dist(),它按照指定方法计算数据矩阵行之问的距离,默认计算欧式距离,算完后返回一个所有距离的矩阵,其调用格式为

dist (x,method = "euclidean",diag=FALSE,upper=FALSE,p=2)

x表示数据矩阵:method用于指定计算方法,diag是逻辑值,当diag为TRUE时,输出距离矩阵的对角线;类似的,upper为TRUE时,输出距离矩阵的上三角部分。

另一个函数是mahalanobis(),专门用来计算马氏距离,其调用格式为

mahalanobis(x, center,cov,inverted=FALSE,…)

其中x是样本数据的向量或矩阵;center是分布的均值;cov是分布的协方差矩阵,通常使用样本值做估计;inverted是逻辑值,如果为TRUE,则cov应该包含协方差阵的逆。

目前在程序包WMDB中,函数wmd( )可以实现加权马氏距离判别分析,它利用了上面的函数mahalanobis()进行计算,并返回一个结果表单和准确度的报告,在两个总体和多个总体的条件下均可直接计算。

wmd(TrnX, TrnG, Tweight = NULL, TstX = NULL, var.equal = F)

例:

4个经济指标判断企业处于破产状态还是正常运行状态

> B=read.table("d:/data/bankruptcy.txt",header=T) > mu=colMeans(B) #对矩阵的列求均值,直接得到各指标的均值 > Sx=cov(B) #计算训练样品 > distance=mahalanobis(B,mu,Sx) > options(digits=3) #设置显示小数点格式 > distance [1] 4.438 10.528 1.353 1.220 2.158 2.050 4.870 1.340 [9] 2.211 3.265 0.897 1.774 0.471 8.617 1.883 2.928 [17] 2.079 3.732 0.413 1.722 0.492 4.430 5.695 2.024 [25] 1.079 0.371 0.845 0.578 30.306 4.221 0.711 9.011 [33] 7.096 4.696 0.803 1.982 2.955 12.755

训练样本的均值和协方差阵作为总体的估计值,计算结果distance是每个训练样本距离总体的马氏距离,判别分析就是在这个结果的基础上进行的。使用程序包WMDB中的函数wmd()直接计算,首先在不指定参数TstX的情况卜,对训练样品作判别分析,可以得到38个样本的分类判别结果、错判的样本信息以及判别分析的准确度。

> library(WMDB) > G=c(rep(1,17),rep(2,21)) #生成38个训练样品的已知类别 > G=as.factor(G) #转换成因子向量,才能代入函数wmd()计算 > wmd(B,G) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 blong 1 1 1 1 1 1 1 1 2 1 2 2 1 2 1 1 1 2 2 2 2 2 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 blong 2 2 1 2 2 2 2 1 2 1 2 2 2 2 2 2 [1] "num of wrong judgement" [1] 9 11 12 14 25 30 32 [1] "samples divided to" [1] 2 2 2 2 1 1 1 [1] "samples actually belongs to" [1] 1 1 1 1 2 2 2 Levels: 1 2 [1] "percent of right judgement" [1] 0.816

由分析结果可知,根据已知分类的训练样品建立的判别规则,重新应用于训练样品后,出现了7个错判样品,拥有81.6%的准确度。判别分析的准确度与训练样本的数据质量有关。将待判样品的数据输入到矩阵中,函数vmd()根据训练样品矩阵B的数据可以给出待判样品的分类情况。

> newdata=data.frame(X1=c(0.04,-0.06,0.07,-0.13,0.15,0.16,0.29,0.54), + X2=c(0.01,-0.06,-0.01,-0.14,0.06,0.05,0.06,0.11), + X3=c(1.5,1.37,1.37,1.42,2.23,2.31,1.84,2.33), + X4=c(0.71,0.4,0.34,0.44,0.56,0.2,0.38,0.48)) > wmd(B,G,TstX =newdata) #TstX表示待判样品矩阵 1 2 3 4 5 6 7 8 blong 1 1 1 1 2 2 1 1

根据马氏距离判别分析得到的结果,8个待判样品中,除样外,其余6个企业均处于破产状态

12.1.3 Fisher判别法

R程序包MASS提供了做Fisher判别分析的函数lda(),lda(formula, data, ..., subset, na.action)

如果不使用formula作为主要参数,则lda()也可以用如下形式:lda(x, grouping, ..., subset, na.action)

> B=read.table("d:/data/bankruptcy.txt",header=T) > G=c(rep(1,17),rep(2,21)) #生成38个训练样品的已知类别 > G=as.factor(G) #转换成因子向量 > B$class=G #将因子向量G存入数据框B中 > attach(B) > names(B) #显示数据框B中的所有对象 [1] "X1" "X2" "X3" "X4" "class" > library(MASS) > B.lda=lda(class~X1+X2+X3+X4) > B.lda Call: lda(class ~ X1 + X2 + X3 + X4) Prior probabilities of groups: 1 2 0.447 0.553 Group means: X1 X2 X3 X4 1 -0.0794 -0.08882 1.35 0.430 2 0.2257 0.00524 2.67 0.441 Coefficients of linear discriminants: LD1 X1 2.947 X2 -1.291 X3 0.767 X4 -0.590

解释分析结果:Group means给出了类别1. 2下各个变量的均值;Coeff cients of linear discriminants是各判别函数对判别分类的贡献大小,本例是两个总体的判别分析,所以只需要一个判别函数即可。lda()返回的结果B.lda包含根据训练样本建立的判别函数和判别规则,在B.lda的基础上我们对训练样本或待判样本进行分类的判断。首先将lda()的分析结果应用于原来的训练样本进行类别的判断,通过R内置函数predict()完成,并构建一个列联表,与真实类别进行对比。

> class.pre=predict(B.lda)$class #选择预测结果中的对象class,是预测的样本所属类别 > table(class.pre,class) class class.pre 1 2 1 15 3 2 2 18

根据列联表的结果,一共有5个错判的样本,准确度为86.8%。如果我们想要了解判别分析的效果,准确度并不是一个绝对的判断标准,这时我们可以对真实的样本分类和预测分类作卡方检验,用检验的p值来判断判别分析的准确程度。

> chisq.test(class,class.pre) Pearson's Chi-squared test with Yates' continuity correction data: class and class.pre X-squared = 20, df = 1, p-value = 3e-05

卡方检验的p值远小于显著性水平0.05,说明判别分析的预测结果和真实值比较一致,判别分析线性判别函数的具体取值。根据Fisher判别法得到的预测结果是,待判样本中前4个样品对应的企业处J二破产状态,后4个企业处于正常经营状态。

求赏金:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档