线性判别分析(Linear Discriminant Analysis, LDA),也叫 做Fisher线性判别(Fisher Linear Discriminant ,FLD),是模式识别的经典算法,1936年由Ronald Fisher首次提出,并在1996年由Belhumeur引入模式识别和人工智能领域。
线性判别分析的基本思想是将高维的模式样本投影到最佳低维鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果。 投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳的可分离性。因此,它是一种有效的特征抽取方法。使用这种方法能够使投 影后模式样本的类间散布矩阵最大,并且同时类内散布矩阵最小。
可以看到两个类别,一个绿色类别,一个红色类别。左图是两个类别的原始数据,现在要求将数据从二维降维到一维。直接投影到 x1 轴或者 x2 轴,不同类别之间会有重复,导致分类效果下降。右图映射到的直线就是用LDA方法计算得到的,可以看到,红色类别和绿色类别在映射之后之间的距离是最大的,而且每个类别内部点的离散程度是最小的(或者说聚集程度是最大的)。
LDA与PCA(主成分分析)都是常用的降维技术。PCA主要是从特征的协方差角度,去找到比较好的投影方式。LDA更多的是考虑了标注,即希望投影后不同类别之间数据点的距离更大,同一类别的数据点更紧凑。
要说明白LDA,首先得弄明白线性分类器(Linear Classifier):因为LDA是一种线性分类器。对于K-分类的一个分类问题,会有K个线性函数:
仔细研究一下上式,就会发现上式实际上就是一种投影,是将一个高维的点投影到一条高维的直线上。LDA最求的目标是,给出一个标注了类别的数据集,投影到了一条直线之后,能够使得点尽量的按类别区分开,当 k=2 即二分类问题的时候,如下图所示:
下面我来推导一下二分类LDA问题的公式。为简化起见,假设用来区分二分类的直线(投影函数)为:
定义一个投影前的各类别分散程度的矩阵 Si ,这个矩阵看起来有一点麻烦,其实意思是:如果某一个分类的输入点集 Di 里面的点距离这个分类的中心点 mi 越近,则 Si 里面元素的值就越小,如果分类的点都紧紧地围绕着 mi ,则 Si 里面的元素值越更接近0:
同样的将 J(w) 分子化为:
由拉格朗日乘子法,上式等价于
对于 c(c>2) 分类的问题,假定样本数目为 N ,每个类别的样本数 ni ,就可以直接写出以下的结论:
data(iris)
attach(iris)
summary(iris)
library(MASS)
irislad<-lda(iris[,c(1:4)],Species)
predict(irislad)
predict(irislad)$x #lists the linear discriminent scores for each sample
predict(irislad)$posterior #lists the probabilities that a sample belongs to a specific classification grouo
predict(irislad)$class #shows the classification group
table(iris$Species,predict(irislad)$class)
chisq.test(iris$Species,predict(irislad)$class)
##plot the Untrained Data(n=150) by LDA coordinates
plot(predict(irislad)$x,type="n",xlab="LD I",ylab="LD II",main=" Untrained Iris LDA(n=150)")
text(predict(irislad)$x,levels(predict(irislad)$class)[predict(irislad)$class],col=unclass(iris$Species),cex=1.5)
abline(h=0);abline(v=0)