vlambda博客
学习文章列表

R语言:判别分析(距离判别、贝叶斯判别、Fisher判别)

01

解决何种问题

       已知一批有心脏病的人和没有心脏病人的n个指标,怎么用来诊断某个患者是否有心脏病。有一批晴天和雨天的数据,是否可以预测明天是晴天还是雨天?

       用判别分析法可解决此类问题,它是在已知总体分类特征的情况下,根据已知分类样品的数据对未知类别的样品进行归类。

02

方法说明

       判别分析主要有三大类,分别是距离判别、贝叶斯判别和Fisher判别 。

       距离法的基本原理是找到各类指标的重心,计算待测点到该类的距离。找出最小的距离,则待判点属于该类。主要以马氏距离为代表,该距离在欧氏距离的基础上消除量纲的影响。其计算公式如下:

      x代表待分类样本,u为总体样本均值,Σ是总体协方差。它的判别准则是:

R语言:判别分析(距离判别、贝叶斯判别、Fisher判别)

       判别准则表示:待测样本距离哪个总体距离最近,则认为它属于哪一类。其中d是上面公式的定义的样本x到总体Xj的马氏距离,若认为方差相同则上面公式的Σ是用总体协方差,若不相等,则用每个类的Σj估计。

      贝叶斯判别基本原理是利用样本的先验概率计算密度函数,在使用密度函数计算待定点的后验概率,相应概率最大对应哪一类,相应判别准则为:

R语言:判别分析(距离判别、贝叶斯判别、Fisher判别)

      其中pi对应有k类样本的先验概率,fi(x)为k类样本的概率密度函数

       当k类总体的协方差阵相同时d的计算公式为:

R语言:判别分析(距离判别、贝叶斯判别、Fisher判别)

       当k类总体的协方差阵不相同时d的计算公式

R语言:判别分析(距离判别、贝叶斯判别、Fisher判别)

       判别准则可简化为:

R语言:判别分析(距离判别、贝叶斯判别、Fisher判别)

      不难发现判别规则是距离判别的拓展。

      Fisher判别又叫线性判别法,其基本原理是在空间上找到一条直线,将数据投影到该直线上。使投影后的数据的同一类别内的方差足够小,而类间的方差足够大的准则来判别的。以两个分类为例子,下图可以清晰看到Fisher的精妙之处。计算的时候将待测点样本投影到直线上,计算投影与样本总体投影相比较,以判断属于哪一类。

R语言:判别分析(距离判别、贝叶斯判别、Fisher判别)

      其判别公式如下:

R语言:判别分析(距离判别、贝叶斯判别、Fisher判别)

      其中d是总体2和总体1平均值之差,S为总体协方差,`x为2个总体指标平均值。当w(x)≤0,归属第一类,反之,则归为第二类。

03

R代码

##距离判别法library(WMDB)X <- iris[,1:4]  ##选取鸢尾花数据集的14列作为样本G <- gl(3,50)  ##为鸢尾花所属类别wmd(X,G)   ###调用距离函数 默认协方差不相等。##返回结果## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28##blong 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1## 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53##blong 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2## 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78##blong 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 3 2 2 2 2 3## 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102##blong 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3## 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120##blong 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138##blong 3 3 3 3 3 3 3 3 3 2 3 3 3 2 2 3 3 3## 139 140 141 142 143 144 145 146 147 148 149 150##blong 3 3 3 3 3 3 3 3 3 3 3 3##  结果为经距离判别,判别这150个样本分属于与哪一类。##[1] "num of wrong judgement"##[1]  69  73  78  84 107 130 134 135   ## 将判错的结果返回。##[1] "samples divided to"##[13 3 3 3 2 2 2 2                   ##错判到哪个类别##[1"samples actually belongs to"     ##实际样本属于哪个类别##[1] 2 2 2 2 3 3 3 3##Levels: 1 2 3##[1"percent of right judgement"       ##判断准确率##[10.9466667                         ##判对142个除以总样本数

    在实际工作中需要对考察判别方法的外推性,常将总样本随机分成训练样本和测试样本。

set.seed(2020)     ##设置随机种子index <- c(sample(1:50,5),sample(51:100,5),sample(101:150,5)) ##随机抽取样本train <- iris[-index,1:4] ##构建训练集test <- iris[index,1:4]  ##构建测试集new_G <- gl(3,45)   ##生成新d 花种所属类别wmd(train,new_G)    ##测试一下内部验证的准确性##[1] "percent of right judgement"##[1] 0.9407407wmd(TrnX=train,TrnG=new_G,TstX=test)   ##测试距离判别法的外推性## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15##blong 1 1 1 1 1 2 3 2 2  2  3  3  3  3  3##可以看到第7号样本判错了  准确率为 14/15 = 93.3%
##贝叶斯判别dbayes(train,new_G) ##调用该函数做贝叶斯判别##[1] "percent of right judgement"  ##返回的准确率结果是97.7%##[1] 0.9777778dbayes(train,new_G,TstX=test)  ##同上,测试下贝叶斯分类的外推性能# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15#blong 1 1 1 1 1 2 3 2 2 2 3 3 3 3 3 ## 同上  错判一个,准确率w诶14/15
##fisher 分类器library(MASS)trainset <- cbind(train,new_G)fisher <- lda(trainset$new_G~.,data = trainset)fisher##Prior probabilities of groups:## 1 2 3 ##0.3333333 0.3333333 0.3333333 ##总样本中每个内别所占比例
##Group means:## Sepal.Length Sepal.Width Petal.Length Petal.Width##1 5.013333 3.433333 1.468889 0.2488889##2 5.922222 2.753333 4.224444 1.3133333##3 6.624444 2.973333 5.557778 2.0111111##上面展示的是每个类中每个指标的平均值
##Coefficients of linear discriminants: LD1 LD2##Sepal.Length 0.9436467 0.03131806##Sepal.Width 1.3728747 2.26984624##Petal.Length -2.2595449 -0.71933207##Petal.Width -2.7768608 2.39713978###上面展示的是LD1和LD2的系数,即我们找到的直线方程
table(predict(fisher)$class,new_G)  ## new_G## 1 2 3## 1 45 0 0## 2 0 43 1## 3 0 2 44##可以查看分类的准确性,第二类判错1个,第三类判错2个,准确率142/145=97.9%## 用fisher判别法来测试下外推性predict(fisher,test)$class [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3Levels: 1 2 3## 返回结果解释同上,所有的样本都判别正确,爱护只能却屡100%

04

结果解读

      以上是在R中采用三种不同的方法判别鸢尾花数据集,并验证各个方法的外推性,fisher判别的准确率最高。在应用时候,可以运用多个方法测试样本,选择准确率高的模型作为最终分类器。此外还可以应用机器学习的方法实现分类,例如决策树,随机森林,神经网络等,这个会在之后的文章中分享,敬请关注!

05

参考文献


  1. 孙振球等. 医学统计学. 人民卫生出版社。

  2. 薛毅等.统计建模与R软件.清华大学出版社

更多阅读: