二次判别分析(QDA)及其在R中实现
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朵鸢尾花的花朵性状测量值。
这些鸢尾花来自三种物种,分别为setosa(n=50)、versicolor(n=50)和virginica(n=50)。
包含四种性状,分别为萼片长度(sepal length,cm)、萼片宽度(sepal width,cm)、花瓣长度(petal length,cm)和花瓣宽度(petal width,cm)。
data(iris)
head(iris)
接下来期望从中找到合适的“变量组合”,作为区分不同鸢尾花的代表特征。
前篇已经使用该数据集展示了R包MASS实现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)
实际应用中,还可以通过指定一个后验概率阈值,过滤模糊识别的结果,只保留较为可信的预测分类信息以提升优度等。
参考资料