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

2019-04-10 10:41:54 浏览数 (1)

判别分析

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

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个企业处于正常经营状态。

求赏金:

0 人点赞