写在前面:
分类是管理学、金融学、统计学等常用的实证分析方法之一,目前,分类的方法有逻辑回归、支持向量机、贝叶斯分类、决策树、支持向量机、卷积神经网络、线性判别分类器等等。方法有很多,不同的方法适用于不同的环境,其难易度也不同。
本文对硕士论文中的线性判别分析(LDA)和二次判别分析(QDA)进行实例分析,讲述在R语言中的建模过程与结果。
在开始建模前,首先说一下,为什么拿这两个模型进行对比。与线性判别分析类似,二次判别分析是另外一种线性判别分析算法,二者拥有类似的算法特征,区别仅在于:
当不同分类样本的协方差矩阵相同时,使用线性判别分析;当不同分类样本的协方差矩阵不同时,则应该使用二次判别。
此外,注意LDA和QDA与之前的SVM、逻辑回归是不同的分类,此处对LDA与QDA更准确的描述为判别(判断类别)分析,即已知很多类型,判断预测物品属于这些类型中的哪一类。

01
线性判别分析(LDA)和二次判别分析(QDA)简介
1.1、LDA
线性判别分析(linear discriminant analysis,LDA)是对费舍尔的线性鉴别方法的归纳,这种方法使用统计学,模式识别和机器学习方法,试图找到两类物体或事件的特征的一个线性组合,以能够特征化或区分它们。
所得的组合可用来作为一个线性分类器,或者,更常见的是,为后续的分类做降维处理。LDA在破产预测、脸部识别、市场营销、生物医学研究、地球科学等方面应用广泛。
线性判别分析的基本思想是把所有样本投影到一条直线上,使样本在这条直线上最容易分类,且“投影后类内方差最小,类间方差最大”。
1.2、QDA
QDA(Quadratic discriminant analysis)是LDA的变体,其中针对每类观察估计单个协方差矩阵。如果事先知道个别类别表现出不同的协方差,则QDA特别有用。QDA的缺点是它不能用作降维技术。
02
数据集介绍
1936年费希尔收集了三种鸢尾花(分别标记为setosa(山鸢尾)、versicolor(变色鸢尾)和virginica(维吉尼亚鸢尾))的花萼和花瓣数据。包括花萼的长度和宽度,以及花瓣的长度和宽度。改数据包为iris,共包含150条数据。



图2-1:依次为山鸢尾、变色鸢尾和维吉尼亚鸢尾(资料来源:维基百科)
从照片来看,三者没有区别。但是内在是有区别的。
我们将根据这四个特征来建立支持向量机模型从而实现对鸢尾花的分类判别任务。
如下图所示:iris数据集中更有三种品种的鸢尾,蓝色为山鸢尾、粉色为变色鸢尾,绿色为维吉尼亚鸢尾。
其中山鸢尾和其他两个品种的鸢尾在花瓣的长度和宽度上具有显著的差异,而变色鸢尾和维吉尼亚鸢尾并没有特别明显的界限。
03
代码运行
本文选取virginica(维吉尼亚鸢尾)作为评判,进行非维吉尼亚鸢尾(赋值为0)和维吉尼亚鸢尾(赋值为1)的判别分析。
3.1初始设置
set.seed(1)
data=iris
data$Species=as.factor(ifelse(data$Species=="virginica",1,0))
#令data数据集里的Species那一列中的鸢尾类型变更为因子型0和1,其中0为其他类型,1为维吉尼亚鸢尾。
is = sample(1:150)#将1到150随机打乱。
z = data[is,]#将iris原本按分类排序的数据改为按照is里的顺序一一排序。
train= z[1:100,] #选取随机排序后数据的前100条作为训练集。
test= z[101:150,] #选取后50条数据作为测试集。
test.x= test[,1:4]#提取出测试集前四列的特征(花萼长、宽和花瓣的长、宽)作为预测时的输入。
test.y= test[,5]#提取测试集真实的分类结果。
library(MASS)#LDA和QDA都需要MASS包来实现,所以需要加载MASS数据包。
3.2 LDA
lda.fit= lda(Species~., data=train)#进行LDA模型的拟合,数据来源选择训练集。
lda.pred = predict(lda.fit, newdata=test.x)#以lda.fit为基础模型,以测试集中的test.x(测试集的前四列自变量)为数据来源进行判别
(tb = table(lda.pred$class, test.y))#提取测试集的预测结果中的类型判别结果,并与测试集的真实值对比,形成一个2*2的table矩阵。
lda.pred$class test.y
0 1
0 30 0
1 5 15
#通过上述结果可以看出,有5个预测值与实际判别值不同。
sum(diag(tb))/sum(tb)#查看准确率。
[1] 0.9
#LDA在iris数据集中的二分类的精准度为90%。
3.3 QDA
qda.fit = qda(Species~., data=train) )#进行QDA模型的拟合,数据来源选择训练集。
qda.pred = predict(qda.fit, newdata=test.x) )#以qda.fit为基础模型,以测试集中的test.x(测试集的前四列自变量)为数据来源进行判别
(tb = table(qda.pred$class, test.y)) ))#提取测试集的预测结果中的类型判别结果,并与测试集的真实值对比,形成一个2*2的table矩阵。
qda.pred$class test.y
0 1
0 34 0
1 1 15
#通过上述结果可以看出,只有1个预测值与实际判别值不同。
sum(diag(tb))/sum(tb))#查看准确率。
[1] 0.98
#QDA在iris数据集中的二分类的精准度为98%。
通过前两个模型的拟合结果来看,QDA在iris数据集中的分配判别结果要优于LDA。