查看原文
其他

二次判别分析(QDA)及其在R中实现

生信小白鱼 鲤小白 小白鱼的生统笔记 2022-05-08
二次判别分析(QDA)及其在R中实现
线性判别分析(LDA)类似,二次判别分析(Quadratic Discriminant Analysis,QDA)是另外一种广泛使用的判别分析算法。
    

LDA与QDA


LDA已在前文作了简介,其假设每个类别中的观测值均来自多元正态分布,并且预测变量的协方差在响应变量Y的所有k个水平上都是相同的,即默认不同分组样本的协方差矩阵近似相等。QDA提供了另一种思路,尽管QDA同样要求每个类别中观测值的正态性,但不再假定预测变量在Y的k个水平上的方差齐性,即允许每个类别的协方差矩阵不等。

也就是可以这样去理解,如果以图形展示数据,则每个类别内的数据分布都可描述为一个椭圆体(取决于正态性)。当代表每个分组的椭圆体具有相似方向时(左图,代表了各类别近似相等的协方差矩阵),LDA是合适的;否则(右图,代表了各类别的协方差矩阵不等),QDA更为推荐。


 

因此与LDA相比,QDA通常更加灵活。

顾名思义,LDA和QDA分别定义了线性决策面和二次决策面。

继续考虑下图,在尝试将观测数据分为两个类别时,LDA提供了线性决策边界,该边界假设观测值在所有类别中的变化水平相似(左上),这种情况下可有效判别分类;但当每个类别中观测值的变异性存在明显区别时(左下),线性决策边界将难以准确地划分数据。而QDA则能分别考虑各类别的不同协方差,并提供更准确的非线性分类决策边界;在近似等同的协方差矩阵下,LDA和QDA的分类结果无明显区别(右上,相比左上);但当各类别的协方差矩阵区别明显时,QDA往往更为可靠(右下,相比左下)。


如下继续展示一例三组分类的示例,表现QDA比LDA能够更加准确地识别类间边界。


 

尽管看起来很直观,QDA通常优于LDA,这种优势主要体现在训练集数据量较大、或者观测类别较多时的情况,此时等协方差矩阵的假设经常被拒绝。

当训练集数据较少时,LDA往往比QDA更好。

    

R包MASS的QDA

 

数据集


iris数据集,记录了150朵鸢尾花的花朵性状测量值。

这些鸢尾花来自三种物种,分别为setosan=50)、versicolorn=50)和virginican=50)。

包含四种性状,分别为萼片长度(sepal lengthcm)、萼片宽度(sepal widthcm)、花瓣长度(petal lengthcm)和花瓣宽度(petal widthcm)。


#数据集,详情 ?iris
data(iris)
head(iris)

 

接下来期望从中找到合适的“变量组合”,作为区分不同鸢尾花的代表特征。

前篇已经使用该数据集展示了RMASS实现LDA的方法,本篇继续使用该包计算QDA。

  

执行QDA


QDA同样要求输入数据满足(多元)正态性,如果正态性假设被拒绝,可尝试转化数据的方式(如log转化,但要保证这种转化方式是合理的),获得正态分布的数据。

前篇LDA已通过QQ证实该数据集满足多元正态性假设,接下来执行QDA。


为了更好地展示QDA的分类器功能,将示例数据集分为两部分,一部分作为训练集用于QDA降维及分类器构建,另一部分作为测试集进一步评估QDA预测分类的功效。

library(MASS)

#可选标准化数据
#本示例的 4 个变量的量纲一致(都是以 cm 为单位),且无极端值,理论上不用标准化
#但为了和前文 LDA 的结果相比较(前文数据标准化了),选择了对它标准化
iris[1:4] <- scale(iris[1:4])

#将数据集随机分为训练集(80%)和测试集(20%)
set.seed(123)
training <- sample(rownames(iris), nrow(iris)*0.8)

train.data <- subset(iris, rownames(iris) %in% training)
test.data <- subset(iris, ! rownames(iris) %in% training)

#使用测试集拟合 QDA 模型,详情 ?qda
model <- qda(Species~., data = train.data)
model


qda()确定各组数据的平均值并计算对象属于不同组的概率,将对象划分到概率最高的组中。

Prior probabilities of groups,各组的先验概率,即已知分组中所含对象数量占总数量的比例。例如在本示例中,随机抽取的训练集的setosa组中共含有40个对象(40个鸢尾花观测个体),占训练集所有对象(总计120个鸢尾花观测个体)的33.3%。

Group means,组均值,展示了每个分组中变量的平均值。

 

随后,构建的分类器将对测试集对象预测分类。

对比训练集中对象的既定分组属性和由QDA判别的分组属性的一致性,结果可表征QDA模型的拟合精度。

#模型拟合精度,训练集
predictions <- predict(model, train.data)

#查看训练集对象的后验概率,即根据概率划分到高概率的类中
head(predictions$posterior)
#查看对训练集对象预测的分类
head(predictions$class)
#比较预测的分类和已知先验分类属性的差异,结果反映了准确度信息
mean(predictions$class == train.data$Species)


结果显示,99%以上的对象能够被分类到正确的类别中。

和前文LDA结果(使用相同的训练集数据,精度约~98%)相比,本示例也显示了QDA对训练集对象分类属性的识别有了提升,尽管甚微。

 

现在更改为测试集,进一步评估QDA分类器精度。

#模型拟合精度评估,测试集
predictions <- predict(model, test.data)
mean(predictions$class == test.data$Species)


结果显示,对于测试集,约97%以的对象能够被分类到正确的类别中,表明QDA分类器的精度也是可靠的。

#后验概率也可通过热图展示
heatmap(predictions$posterior, Colv = NA, cexRow = 1, cexCol = 1)

 

实际应用中,还可以通过指定一个后验概率阈值,过滤模糊识别的结果,只保留较为可信的预测分类信息以提升优度等。

    

参考资料


https://scikit-learn.org/stable/modules/lda_qda.html
http://uc-r.github.io/discriminant_analysis
http://www.sthda.com/english/articles/36-classification-methods-essentials/146-discriminant-analysis-essentials-in-r/

 


链接

线性判别分析(LDA)及其在R中实现

R包ropls的正交偏最小二乘判别分析(OPLS-DA)

R包ropls的偏最小二乘判别分析(PLS-DA)

R包tidyLPA的潜剖面分析(LPA)

R包poLCA的潜类别分析(LCA)

R包lavaan的结构方程建模-潜变量结构模型

R包piecewiseSEM的分段结构方程建模

R包lavaan的结构方程建模-路径分析

结构方程模型(SEM)和分段结构方程模型简介

R包lavaan的验证性因子分析(CFA)

R包vegan的基于距离的冗余分析(db-RDA)

处理同时含有定量和分类变量的数据集的PCA方法



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存