就在大家都在社交平台上各种“阳”言“阳”语的时候,俺不幸地中招了,😂😂😂,俺“杨过”了,但是只希望俺从此以后能够“杨迪”,因为这痛苦的几天真心不想再经历一遍😵😵😵
OK,言归正传,今天要学习的是判别分析。
判别分析(Discriminant analysis)是多元统计分析中用于判别样品所属类型的分析方法。它是从已知的各种分类情况中总结规律(训练出判别函数),当新样品进入时,判断其与判别函数之间的相似程度,从而得到新样品的归属分类。
1. Wine数据集
library(candisc)
library(ggplot2)
# 加载数据
data(Wine)
# 相关系数矩阵
data_1 <- princomp(Wine[,2:13],cor=T)
# 主成分得分,选取前两个成分
data <- data.frame(data_1$scores[,1:2],Wine$Cultivar)
head(data)
# 线性判别分析
library(MASS)
library(klaR)
winelda <- lda(Wine.Cultivar~.,data)
winelda
# 第一及第二线性判别函数解释方差的比例
# 线性判别分析可视化
par(family = "STKaiti")
partimat(Wine.Cultivar ~ ., data = data,method = "lda",main = "线性判别")
# Comp.1和Comp.2两个特征的识别精度很高,说明这两个主成分确实对差异性的解释度较大。
# 二次判别分析可视化
par(family = "STKaiti")
partimat(Wine.Cultivar ~ ., data = data,method = "qda",main = "二次判别")
# 错误率有所增加,说明该数据集使用二次判别分类器并不比使用线性判别分类器的分类效果好。
2. diabetes数据集
# 加载包
library(mclust)
# 加载数据
data(diabetes)
nrow(diabetes)
# 数据处理
set.seed(1234)
index <- sample(nrow(diabetes),100)
diabetes_train <- diabetes[index,]
diabetes_test <- diabetes[-index,]
# 线性判别分析
diabeteslda <- lda(class~.,diabetes_train)
diabeteslda
# 线性判别分析可视化
options(repr.plot.width=8, repr.plot.height=4)
par(family = "STKaiti")
partimat(class ~ ., data = diabetes_train,method = "lda",main = "线性判别")
# 三组特征组合的识别精度都较低。
# 预测测试集
diabetespre <- predict(diabeteslda,diabetes_test)
table(diabetes_test$class,diabetespre$class)
# Chemical Normal Overt
# Chemical 4 4 0
# Normal 2 24 0
# Overt 0 0 11
# 从混淆矩阵来看,只有6个样本预测错误,其他样本均预测正确。
# 二次判别分析
diabetesqda <- qda(class~.,diabetes_train)
diabetesqda
# 二次判别分析可视化
par(family = "STKaiti")
partimat(class ~ ., data = diabetes_train,method = "qda",main = "二次判别")
# 和线性判别方法相比,三组特征组合的分类错误率有所下降,说明使用二次判别分析比使用线性判别分析的分类效果要好。