当前位置:网站首页>数据挖掘-05

数据挖掘-05

2022-08-09 12:01:00 画个圈圈诅咒你 yebo

线性判别分析

线性判别分析(linear discriminant analysis,LDA)是对费舍尔的线性鉴别方法的归纳,这种方法使用统计学模式识别和机器学习方法,试图找到两类物体或事件的特征的一个线性组合,以能够特征化或区分它们。所得的组合可用来作为一个线性分类器,或者,更常见的是,为后续的分类做降维处理。

线性判别分析是一种经典的线性学习方法,在二分类问题上最早由Fisher在1936年提出,亦称Fisher线性判别。线性判别的思想非常朴素:给定训练样例集,设法将样例投影到一条直线上,使得同类样例的投影点尽可能接近,异样样例的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的直线上,再根据投影点的位置来确定新样本的类别。 [2] 

LDA与方差分析(ANOVA)和回归分析紧密相关,这两种分析方法也试图通过一些特征或测量值的线性组合来表示一个因变量。然而,方差分析使用类别自变量和连续数因变量,而判别分析连续自变量和类别因变量(即类标签)。逻辑回归和概率回归比方差分析更类似于LDA,因为他们也是用连续自变量来解释类别因变量的。

LDA的基本假设是自变量是正态分布的,当这一假设无法满足时,在实际应用中更倾向于用上述的其他方法。LDA也与主成分分析(PCA)和因子分析紧密相关,它们都在寻找最佳解释数据的变量线性组合。LDA明确的尝试为数据类之间不同建立模型。 另一方面,PCA不考虑类的任何不同,因子分析是根据不同点而不是相同点来建立特征组合。判别的分析不同因子分析还在于,它不是一个相互依存技术:即必须区分出自变量和因变量(也称为准则变量)的不同。在对自变量每一次观察测量值都是连续量的时候,LDA能有效的起作用。当处理类别自变量时,与LDA相对应的技术称为判别反应分析。

优点

可以直接求得基于广义特征值问题的解析解,从而避免了在一般非线性算法中,如多层感知器,构建中所常遇到的局部最小问题无需对模式的输出类别进行人为的编码,从而使 LDA 对不平衡模式类的处理表现出尤其明显的优势。与神经网络方法相比,LDA 不需要调整参数,因而也不存在学习参数和优化权重以及神经元激活函数的选择等问题;对模式的归一化或随机化不敏感,而这在基于梯度 下降的各种算法中则显得比较突出 [3]  。在某些实际情形中,LDA 具有与基于结构风险最小化原理的支持向量机(SVM)相当的甚至更优的推广性能,但其计算效率则远优于SVM。正则判别分析法(CDA)寻找最优区分类别的坐标轴(k-1个正则坐标,k为类别的数量)。 这些线性函数是不相关的,实际上,它们通过n维数据云定义了一个最优化的k-1个空间,能够最优的区分k个类(通过其在空间的投影)。。

多类LDA:当出现超过两类的情况时,可以使用由费舍尔判别派生出的分析方法,它延伸为寻找一个保留了所有类的变化性的子空间。这是由 C.R.Rao 总结出来的。假设,C个类中每一个类都有均值和相同的协方差。

要实现典型的LDA技术前提是所有的样本都必须提前准备完毕。但有些情况下,没有现成的完整数据集或者输入观察数据是流的形式。这样,就要求LDA的特征提取有能力随着观察新样本的增加而更新LDA的特征,而不是在整个数据集上运行算法。例如,在移动机器人或实时脸部识别等实时应用中,提取的LDA特征能随着新观察值实时更新是非常重要的。这种能够通过简单观察新样本来更新LDA特征的技术就叫做增量LDA算法,在过去二十年里,它已经被广泛的研究过。Catterjee和Roychowdhury提出了一种增量自组织LDA算法来更新LDA特征。另外,Demir和Ozmehmet提出利用误差改正和赫布学习规则的线上本地学习算法来更新LDA特征。最后,Aliyari等人提供了快速增量LDA算法。

线性判别分析

执行线性判别分析可使用lda()函数,且该函数有三种执行形式,依次尝试使用。

(1)公式formula格式

我们使用nmkat变量作为待判别变量,其他剩余的变量作为特征变量,根据公式nmkat~使用训练集数据来运行lda()函数:

1

2

3

4

5

6

7

library(MASS)

library("MASS")

fitlda1<-lda(nmkat~.,datatrain)   #以公式格式执行判别分析

names(fitlda1)    #查看lda输出项名称

 

结果分析:我们看到,可以根据lda()函数得到10项输出结果,分别为执行过程中所使用的先验概率prior、数据集中各类别的样本量counts、各变量在每一类别中的均值 means等。

1

fitlda1$prior   #查看本次执行过程中所使用的先验概率

 

1

fitlda1$counts    #查看数据集datatrain中各类别的样本量

 

结果分析:由于我们在之前的抽样过程中采用的是nmkat各等级的等概率分层抽样方式,因此如上各类别的先验概率和样本量在5个等级中都是相等的。具体的,5类的先验概率都为0.2,之和为1,且训练集中每一类都抽出了144个样本。

1

fitlda1$means

 

结果分析:在如上的均值输出结果中,我们可以看到一些很能反映现实情况的数据特征。比如,对于占地面积wfl变量,它明显随着租金nmkat的升高而逐步提高,我们看到在租金为等级1(少于500马克)时,占地面积的均值仅为55.53平方米,而对于租金等级5(租金不低于1150 马克),平均占地面积则达到了92.24平方米。面积越大的房屋租金越贵,这是十分符合常识的。

执行fitlda1可直接将判别结果输出。

(2)数据框data.frame及矩阵matrix格式

由于这两种函数格式的主体参数都为x与grouping,我们放在一起实现,程序代码如下:

1

fitlda2<-lda(datatrain[,-12],datatrain[,12])

#设置属性变量(除第12个变量nmkat外)与待判别变量(第12个变量nmkat)的取值

1

fitlda2

2.判别规则可视化

我们首先使用plot()直接以判别规则fit_ldal为对象输出图形,如下图所示:

1

plot(fitlda1)

 

结果分析:从图可以看到,在所有4个线性判别式(Linear Discriminants,即 LD)下1至5这5个类别的分布情况,不同类别样本已用相应数字标出。

我们可以通过dimen参数的设定来控制输出图形中所使用的判别式个数当参数取值大于总共的判别式个数式,则默认取所有样式,比如下面分别以 dimen=1和2为例生成图形,分别如图所示:

1

2

3

plot(fitlda1,dimen=1)  #变量太多,画布显示不出来

plot(fitlda1,dimen=2)

 

结果分析:1类和5类比较分明,2,3,4类重叠很多。

3.对测试集待判别变量取值进行预测

下面我们来使用之前得到的判别规则fitldal来对测试集 datatest中的待判别变量nmkat 的类别进行预测。

1

2

3

prelda1<-predict(fitlda1,datatest)  #使用类别规则fitlda1预测datatest中nmkat变量的类别

prelda1$class  #输出datatest中个样本的预测结果

 

1

prelda1$posterior  #输出个样本属于每一类别的后验概率

 

结果分析:将class与 posterior的输出结果相结合来看,我们知道每一样本属于各类别的后验概率最高者为该样本被判定的类别。比如,posterior输出项中序号为“3”的样本属于第2类的概率最高,约为0.501,因此该样本在此次判别中被归为类别2。

为了进一步评价本次判别的效果,我们可以生成测试集中nmkat变量的预测结果与其实际类别的混淆矩阵,代码如下:

1

table(datatest$nmkat,prelda1$class)

 

1

table(datatest$nmkat)

 

结果分析:由上面的混淆矩阵,行表示实际的类别,列表示预测判定的类别。在362个测试样本中,实际属于第1类的有75个,而由判定结果,75个样本中,有57个判定正确,14个错判成第2类,3个错判成第3类。且该矩阵的非对角线上的元素之和为120,也就是说120个样本被判错了,错误率则可以通过计算得到,为0.33=120/362。

其中,属于第3类的样本被错分的个数最多,共有31个(约占总量的一半)被错误分类。这之中有17个被错分入类别2,13个分入类别4。这很可能是由于类别3与类别2、4的样本之间相似度太高,表现在图形中即为有较大的重叠区域所导致的分类困难,正如我们在上图所看到的,2、3、4这三个中等租金额的样本点聚集在一起难以分割。

可以计算错误率来评价分类效果:

1

2

3

errorlda1<-sum(as.numeric(as.numeric(prelda1$class)!=as.numeric(datatest$nmkat)))/nrow(datatest)

errorlda1

 

原网站

版权声明
本文为[画个圈圈诅咒你 yebo]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_53950248/article/details/126217626