专栏首页小白鱼的生统笔记几种常见的判别分析分类方法在R中实现

几种常见的判别分析分类方法在R中实现

几种常见的判别分析分类方法在R中实现

判别分析(Discriminant analysis)用于基于一个或多个预测变量来预测对象属于某个给定类的概率,它对于连续或分类预测变量均适用。与logistic回归相比,判别分析在处理多分类问题时更稳健。

本篇汇总几种常见的判别分析类型的R操作过程,主要如下。

线性判别分析(Linear discriminant analysis,LDA),使用预测变量的线性组合预测给定的观测类别。LDA假设预测变量服从(多元)正态分布,并且类别间具有相同的方差(对于单变量分析)或相同的协方差矩阵(对于多变量分析)。

二次判别分析(Quadratic discriminant analysis,QDA),比LDA更灵活,假设预测变量服从(多元)正态分布,但允许各类别的协方差矩阵不等。

混合判别分析(Mixture discriminant analysis,MDA),假定每个类别都是子类别的高斯(正态)混合。

弹性判别分析(Flexible Discriminant Analysis ,FDA),使用预测变量的非线性组合,例如样条曲线(splines)。

正则化判别分析(Regularized discriminant anlysis,RDA),在预测变量数量大于训练集对象数量的情况下,正则化可改进协方差矩阵的估计。(注意其与冗余分析(Redundancy analysis,RDA)的缩写相同,不要混淆)

测试数据集

数据集概要

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

这些鸢尾花来自三种物种,分别为setosa(n=50)、versicolor(n=50)和virginica(n=50)。

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

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

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

*探索性分析

首先不妨查看一下各变量的数值分布,哪些花朵性状在不同物种之间具有明显的区别。

#变量分布
library(ggplot2)
 
ggplot(reshape2::melt(iris, id = 'Species'), aes(x = value)) +
geom_histogram(aes(fill = Species), color = 'gray') +
facet_wrap(~variable, ncol = 2, scales = 'free')

直方图清晰地表明,花瓣的长度和宽度似乎可以作为潜在特征,用以区分三种鸢尾花物种。

相比直接选取部分趋势明显的变量作为代表,通过降维技术所确定的变量组合特征通常是种更为实用的选择,例如主成分分析(PCA)。

#通过 PCA 降维数据,观测数据特征
pca <- princomp(iris[1:4])
plot(pca$scores[ ,1], pca$scores[ ,2], col = rep(c('red', 'green', 'blue'), summary(iris$Species)))

PCA显示,第一主成分可作为区分不同鸢尾花物种花朵性状的潜在特征。

接下来接入本篇的方法部分,结合已知的物种分类,使用带监督模式的判别分析实现数据降维,选择代表性的变量组合特征,以及实现分类。

线性判别分析(LDA)

LDA的原理方法简述可见该文。

LDA要求输入数据满足(多元)正态性,可通过QQ图评估。

#QQ-plot 检验多元正态性
qqplot(qchisq(ppoints(nrow(iris[1:4])), df = ncol(iris[1:4])), mahalanobis(iris[1:4], colMeans(iris[1:4]), cov(iris[1:4])))
abline(a = 0, b = 1)

QQ图显示了示例数据集满足多元正态性。

如果正态性假设被拒绝,可尝试转化数据的方式(如log转化,但要保证这种转化方式是合理的),获得正态分布的数据。

变量的标准化也是推荐的一步,对于消除变量间的量纲差异或者较大方差变量的权重时非常有效,可提高降维的精度。

#视情况选择标准化数据,如标准化为均值 0,标准差 1 的结构
iris[1:4] <- scale(iris[1:4], center = TRUE, scale = TRUE)

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

#将数据集随机分为训练集(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)

经过几个准备步骤后,执行LDA,这里以MASS包中的方法为例。

LDA算法首先查找使类别之间距离最大化的方向(即LDA轴),作为变量响应分类的最佳线性组合,并通过这种组合进一步预测分类。

library(MASS)
 
#拟合模型,详情 ?lda
model <- lda(Species~., data = train.data)
model

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

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

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

Coefficients of linear discriminants,线性判别系数,用于形成LDA决策规则的预测变量的线性组合。例如,LD1 = 0.828*Sepal.Length + 1.438*Sepal.Width - 2.179*Petal.Length - 2.656*Petal.Width。可在降维后根据线性判别系数所得表达式,预测训练集的分类。

Proportion of trace,可以将它理解为各LDA轴的“方差解释率”,以评估各LDA轴的重要程度,示例结果显示LDA第一主轴是非常重要的。

#作图观测对象在前两 LDA 轴中的投影
plot(model, col = rep(c('red', 'green', 'blue'), summary(train.data$Species)), dimen = 2)
 
#或者 ggplot2 作图
ggplot(cbind(train.data, predict(model)$x), aes(LD1, LD2, color = Species)) +
geom_point() +
stat_ellipse(level = 0.95, show.legend = FALSE)

结果显而易见了,LDA第一主轴承载了最能体现类间差异的特征。

有关ggplot2可视化的调整可见“排序图绘制”。

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

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

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

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

#对测试集预测分类
predictions <- predict(model, test.data)
mean(predictions$class == test.data$Species)

结果显示,约97%以的对象能够被分类到正确的类别中,LDA分类器的精度是相对可观的。

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

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

二次判别分析(QDA)

从某种意义上说,QDA由于不假定各类别的协方差相等,因此它比LDA灵活得多。这种优势主要体现在训练集数据量较大、或者观测类别较多时的情况,此时LDA要求的等协方差矩阵的假设经常被拒绝。

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

MASS包也提供了QDA的方法。

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

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

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

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

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

#对训练集预测分类
predictions <- predict(model, train.data)
mean(predictions$class == train.data$Species)

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

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

#对测试集预测分类
predictions <- predict(model, test.data)
mean(predictions$class == test.data$Species)

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

混合判别分析(MDA)

无论LDA或QDA均要求每个类别的数据服从多元正态(高斯)分布。

对于MDA中存在的多个类别,均被假定为更多子类别的高斯混合,其中每个对象都有属于每个类别的概率。但MDA仍然假设各类别的协方差矩阵相等。

MDA可使用mda包实现。

library(mda)
 
#使用测试集拟合模型,详情 ?mda
model <- mda(Species~., data = train.data, subclasses = 3)
model
 
plot(model)

例如在上式中,定义每个既定类别均由3个子类别组成,通过这些子类别进行拟合分类。Training Misclassification Error代表了对训练集对象预测分类错误率,示例结果显示错误率很低。

散点图展示了降维后的数据特征,MDA第一主轴承载了最能体现类间差异的特征。

对于模型预测功能的实现,和上文方法类似。

#对训练集预测分类
predictions <- predict(model, train.data)
mean(predictions == train.data$Species)    #结果等于 1-Training Misclassification Error
 
#对测试集预测分类
predictions <- predict(model, test.data)
mean(predictions == test.data$Species)

有些情况下,通过识别更小子类的MDA方法,可能会胜过全局识别模式LDA和QDA。

如下所示,存在3个主要的类别,每个类别又由3个子类别构成,各类别整体不满足正态(高斯)分布,但各子类别满足。由于子类别之间“不连续”,LDA和QDA的决策边界无法有效分类,但MDA可以通过正确识别子类别而实现良好的分类。

弹性判别分析(FDA)

FDA是LDA的灵活扩展,它使用样条曲线等预测变量的非线性组合。FDA可用于对每组内变量之间的多元非正态或非线性关系建模,从而实现更准确的分类。

FDA也可使用mda包实现。

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

同样地,Training Misclassification Error代表了对训练集对象预测分类错误率,示例结果显示错误率很低。

散点图展示了降维后的数据特征,FDA第一主轴承载了最能体现类间差异的特征。

对于模型预测功能的实现,和上文方法类似。

#对训练集预测分类
predictions <- predict(model, train.data)
mean(predictions == train.data$Species)    #结果等于 1-Training Misclassification Error
 
#对测试集预测分类
predictions <- predict(model, test.data)
mean(predictions == test.data$Species)

正则化判别分析(RDA)

RDA通过正则化组协方差矩阵建立分类规则,从而可以针对数据中的多重共线性提供更稳健的模型。这对于包含高度相关预测变量的大型多元数据集可能非常有用。

RDA可视为LDA和QDA之间的一种中间状态。RDA将QDA的独立协方差收缩为与LDA类似的等协方差。在预测变量的数量大于训练集对象数量的情况下,可以改善协方差矩阵的估计,潜在地提高了模型的准确性。

RDA可使用klaR包实现。

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

Regularization parameters,gamma和lambda为两种正则化参数。

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

Misclassification rate,代表了对训练集对象预测分类错误率。

#对训练集预测分类
predictions <- predict(model, train.data)
mean(predictions$class == train.data$Species)
 
#对测试集预测分类
predictions <- predict(model, test.data)
mean(predictions$class == test.data$Species)

参考资料

http://www.sthda.com/english/articles/36-classification-methods-essentials/146-discriminant-analysis-essentials-in-r/

http://sebastianraschka.com/Articles/2014_python_lda.html

本文分享自微信公众号 - 小白鱼的生统笔记(gh_5f751e893315),作者:生信小白鱼 鲤小白

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R语言绘制平行坐标图(PCP)示例

    前文在讲述冲击图(alluvial diagram)时提到了,它在某种形式上是平行坐标图(parallel coordinate plot,PCP)的一种变体,...

    用户7585161
  • 物种多度的非约束排序中被动添加环境变量概述

    前篇先后简介了主成分分析(PCA)、对应分析(CA)、主坐标分析(PCoA)以及非度量多维尺度分析(NMDS)。这些排序方法均属于非约束排序,只涉及一个数据矩阵...

    用户7585161
  • 置换检验概述及其在R中的实现

    某些差异分析方法建立在观测数据服从较好的特定理论分布的基础上,如常见的参数检验T检验、方差分析等,假定观测数据抽样自正态分布;再如分析差异表达基因时最常用的负二...

    用户7585161
  • bootstrap treeview实现target功能,iframe中打开页面

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

    hotqin888
  • 编程小白 | 每日一练(66)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    闫小林
  • MyBatis开发框架的四大核心

    MyBatis 四大核心主要包括(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。

    动力节点Java学院
  • 手把手教你用Python查询你的物流信息

    快递鸟集合了多家快递公司查询接口,输入相应快递公司编码和快递单号就可以获取到对应的物流信息很方便快捷。

    Python进阶者
  • Centos下添加静态路由(临时和永久有效)的操作记录

    公司IDC机房服务器上部署了一套外网LB环境,默认配置的是外网ip的路由地址,由于要和其他内网机器通信,所以需要配置内网ip的路由地址。整个操作过程,记录如下,...

    洗尽了浮华
  • [NewLife.XCode]数据初始化

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简...

    大石头
  • 操作系统核心原理-5.内存管理(下):段式内存管理

      分页系统存在的一个无法容忍,同时也是分页系统无法解决的一个缺点就是:一个进程只能占有一个虚拟地址空间。在此种限制下,一个程序的大小至多只能和虚拟空间一样大,...

    Edison Zhou

扫码关注云+社区

领取腾讯云代金券