判别分析笔记

前言

一般的回归是指因变量为定量变量的情况,而logistic回归主要处理因变量为只取两个值的定性变量情况。如果作为因变量的定性变量取多于两个值的时候,就需要使用线性判别分析(linear discriminant analysis)来处理。判别分析根据自变量来预测因变量的类型。

判别分析原理

差别分析是利用部分已知类别的观测数据来建立模型,这样的数据称为训练集(training set)。我们这里介绍的线性判别分析所得到的模型是一组线性差别公式;每个公式是自变量的一个线性组合;公式的个数和类别数目一样。有了公式之后,就可以把每个未知类别的自变量观测值代入那些差别公式,算出和类别一样多的值;相应于哪一类的值最大,则把该观测值判为属于该类。

判别分析的原理并不复杂,可以简单地描述如下。

如果作为属性变量的因变量有k个预付(即观测值应该分成k个类),而自变量包含p个变量,那么每一个观测值就是p维空间的一个点。整个训练集的各个点(假定有n个点)就按照已知的类别在p维空间中形成共有n个点的k个点群。那么,对于一个未知类别的点,如果离哪一群近,就可以分到哪一集。关键的细节问题是如何定义“远近”或距离。关键是确定一些准则,使得每一个点群内部的点接近,而使各群之间尽量分开。不同的准则造就了不同的差别或分类方法。这里不讨论这些方法的数学细节,这里仅仅就是线性差别分析一种方法,介绍如何通过R得到结果及结果的解释。这里先把p维空间的点按照最能够分开各类的原则投影到二维空间,再根据二维空间这些点的分布得到判别函数。

如何来确定判别分析模型的效果呢?最基本的就是用一个没有参加建模的已知观测值类别的数据来验证。这样的数据集称为测试集或检验集(test set)。把通过模型预测的这些观测值的类别和它们已知的类别比较,就知道有多少划分错了,由此可以计算出误差来。

案例分析

R自带了一个数据集,即iris。这是一个鸢尾花(iris)的数据,该数据给出了150个鸢尾花的萼片长(sepal length)、萼片宽(sepal width)、花瓣长(petal length)、花瓣宽(petal width)以及这些花的种类(Species)这五个变量。萼片和花瓣的长宽是四个定量变量,而各类为分类变量(有3个值,为setosa、versicolour、virginica)。现在,我们建立一个模型,根据萼片和花瓣这四个度量来把鸢尾花进行分类,这里的鸢尾花一共有3种,每种都有50个观测值。

现在我们在每种鸢尾花中也能耐选择一半,也就是25个作为测试集,另外25个用来建模。三种鸢尾花一起,训练集和测试集各有75个观测。由于选择测试集和训练集的过程是随机的,每次计算的结果也不相同,在R软件中,对于不同的成随机数种子,我们得到的结果也不尽相同。下面是对两个随机数种子得到的两个测试集判别结果,每个格子中的数目是相应的真实类的观测被划分到预测类的频数,如下所示:

随机种子数:set.seed(5)

1
2
3
4
5
library(MASS)
set.seed(5)
samp <- c(sample(1:50,25),sample(51:100,25),sample(101:150,25))
a <- lda(Species~.,data=iris,shuset=samp)
summary(predict(a,iris[-samp,])$class)

结果如下所示:

1
2
3
> summary(predict(a,iris[-samp,])$class)
setosa versicolor virginica
25 25 25

随机种子数:set.seed(4)

1
2
3
4
5
library(MASS)
set.seed(4)
samp <- c(sample(1:50,25),sample(51:100,25),sample(101:150,25))
a <- lda(Species~.,data=iris,shuset=samp)
summary(predict(a,iris[-samp,])$class)

结果如下所示:

1
2
3
> summary(predict(a,iris[-samp,])$class)
setosa versicolor virginica
25 23 27

由这两个结果可知,在第一个随机种子下(set.seed(5))下,测试集中的每个类别完全划分正确,在第二个随机种子下(set.seed(4)),错误地划分了4个类别,出错率为4/75。

下图是在建立线性差别函数过程中,把75个训练集的四维空间点投影到二维空间的结果:

1
2
3
library(mda)
z<-fda(Species~.,data=iris[samp,])$fit$fitted
plot(z,pch=c(rep(19,25),rep(2,25),rep(8,25)),xlab="",ylab="")

mark

可以看也,setosa(用实心圆点标记)离另外两种很远,而versicolor(用空心三角形标记)和virginica(用星号标记)这两类则离得比较近,容易划分错,我们从第二个随机种子(set.seed(4))中也能看出来,出错的应时这两类。