线性判别分析Linear Discriminant Analysis (LDA)



原文链接 : http://www.dataivy.cn/blog/%E7%BA%BF%E6%80%A7%E5%88%A4%E5%88%AB%E5%88%86%E6%9E%90linear-discriminant-analysis_lda/

判别分析(Discriminant Analysis)是一种分类方法,它通过一个已知类别的“训练样本”来建立判别准则,并通过预测变量来为未知类别的数据进行分类。线性判别式分析(Linear Discriminant Analysis,简称为LDA)是其中一种,也是模式识别的经典算法,在1996年由Belhumeur引入模式识别和人工智能领域。LDA以Bayes判别思想为基础,当分类只有两种且总体服从多元正态分布条件下,Bayes判别与Fisher判别、距离判别是等价的。

基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳的可分离性。

在文章《主成分分析Principal component analysis(PCA)》中曾介绍过数据降维的主成分分析(PCA),LDA与PCA都是常用的降维方法,二者的区别在于:

  1. 出发思想不同。PCA主要是从特征的协方差角度,去找到比较好的投影方式,即选择样本点投影具有最大方差的方向;而LDA则更多的是考虑了分类标签信息,寻求投影后不同类别之间数据点距离更大化以及同一类别数据点距离最小化,即选择分类性能最好的方向。
  2. 学习模式不同。PCA属于无监督式学习,因此大多场景下只作为数据处理过程的一部分,需要与其他算法结合使用,例如将PCA与聚类、判别分析、回归分析等组合使用;LDA是一种监督式学习方法,本身除了可以降维外,还可以进行预测应用,因此既可以组合其他模型一起使用,也可以独立使用。
  3. 降维后可用维度数量不同。LDA降维后最多可生成C-1维子空间(分类标签数-1),因此LDA与原始维度数量无关,只有数据标签分类数量有关;而PCA最多有n维度可用,即最大可以选择全部可用维度。

从直接可视化的角度,以二维数据降维为例,PCA和LDA的区别如下图:

QQ截图2015051016025711

上图左侧是PCA的降维思想,它所作的只是将整组数据整体映射到最方便表示这组数据的坐标轴上,映射时没有利用任何数据内部的分类信息。因此,虽然PCA后的数据在表示上更加方便(降低了维数并能最大限度的保持原有信息),但在分类上也许会变得更加困难;上图右侧是LDA的降维思想,可以看到LDA充分利用了数据的分类信息,将两组数据映射到了另外一个坐标轴上,使得数据更易区分了(在低维上就可以区分,减少了运算量)。

线性判别分析LDA算法由于其简单有效性在多个领域都得到了广泛地应用,是目前机器学习、数据挖掘领域经典且热门的一个算法;但是算法本身仍然存在一些局限性:

  • 当样本数量远小于样本的特征维数,样本与样本之间的距离变大使得距离度量失效,使LDA算法中的类内、类间离散度矩阵奇异,不能得到最优的投影方向,在人脸识别领域中表现得尤为突出
  • LDA不适合对非高斯分布的样本进行降维
  • LDA在样本分类信息依赖方差而不是均值时,效果不好
  • LDA可能过度拟合数据

以下使用Python的机器学习库SKlearn中的LDA(使用贝叶斯判别)进行案例演示。原始数据集中有4个维度,3个目标分类集。使用其中的最后5个数据作为预测使用,其余作为训练数据。

  1. #coding:utf-8   
  2. from sklearn import datasets
  3. from sklearn.lda import LDA
  4. iris = datasets.load_iris()
  5. X = iris.data[:-5]
  6. pre_x = iris.data[-5:]
  7. y = iris.target[:-5]
  8. print ('first 10 raw samples:', X[:10])
  9. clf = LDA()
  10. clf.fit(X, y)
  11. X_r = clf.transform(X)
  12. pre_y = clf.predict(pre_x)
  13. #降维结果
  14. print ('first 10 transformed samples:', X_r[:10])
  15. #预测目标分类结果
  16. print ('predict value:', pre_y)


 

以下是输出结果,结果看出,原始数据集由于是3个目标分类,因此降维后最多只能产生2个“新维度”:

  1. ('first 10 raw samples:', array([[ 5.1,  3.5,  1.4,  0.2],
  2.        [ 4.9,  3. ,  1.4,  0.2],
  3.        [ 4.7,  3.2,  1.3,  0.2],
  4.        [ 4.6,  3.1,  1.5,  0.2],
  5.        [ 5. ,  3.6,  1.4,  0.2],
  6.        [ 5.4,  3.9,  1.7,  0.4],
  7.        [ 4.6,  3.4,  1.4,  0.3],
  8.        [ 5. ,  3.4,  1.5,  0.2],
  9.        [ 4.4,  2.9,  1.4,  0.2],
  10.        [ 4.9,  3.1,  1.5,  0.1]]))
  11. ('first 10 transformed samples:', array([[ 7.82980001,  0.32152479],
  12.        [ 6.90948663, -0.79927295],
  13.        [ 7.27243493, -0.26853178],
  14.        [ 6.60094723, -0.65305491],
  15.        [ 7.90146095,  0.54669608],
  16.        [ 7.46909339,  1.49939454],
  17.        [ 7.00117745,  0.36240908],
  18.        [ 7.37793873,  0.01740025],
  19.        [ 6.35610395, -1.02010821],
  20.        [ 7.11704798, -0.91694247]]))
  21. ('predict value:', array([2, 2, 2, 2, 2]))


 

LDA可配置的参数包括:

  1. class sklearn.lda.LDA(solver='svd', shrinkage=None, priors=None, n_components=None, store_covariance=False, tol=0.0001)


 

LDA的应用应用场景:

  • 人脸识别中的降维或模式识别
  • 根据市场宏观经济特征进行经济预测
  • 根据市场或用户不同属性进行市场调研
  • 根据患者病例特征进行医学病情预测

 

尾巴

LDA是是一个经典的机器学习算法,它是判别分析中的线性分类器,在很多应用情况下会面临数据稀疏的问题,尤其是在面部识别的场景:数据的维度很可能大于数据的样本量,甚至可能呈几倍的差异。此时,LDA的预测准确率会表现较差,当维度数/样本量达到4倍时,准确率会只有50%左右,解决方法之一是可以对LDA算法进行收缩,Python的SKlearn中的LDA算法支持这一收缩规则。默认情况下,solver的值被设定为“svd”,这在大数据量下的表现很好,但不支持收缩规则;当面临数据稀疏时,我们需要使用“lsqr”或“eigen”,另外,与之配合的是shrinkage参数需要设置成auto以便于算法自动调整收缩值,当然你也可以自己凭借经验将值设定在0~1之间(越大收缩越厉害:0时不收缩,1时意味着对角线方差矩阵将被用作协方差矩阵值的估计)。
plot_lda_001111


====================【好书推荐,我为自己代言】====================

在MATLAB中,你可以通过` Statistics and Machine Learning Toolbox `来实现线性判别分析Linear Discriminant Analysis, LDA)。LDA是一种常用的有监督降维技术,尤其适用于高维分类问题,它试图找到能最大化类别间方差同时最小化类内方差的方向来进行投影。 以下是使用MATLAB进行LDA的基本步骤: 1. **准备数据集**: 假设你有一个包含两个或更多类别的样本矩阵`X`和对应的标签向量`Y`。每个样本应该是一个行向量。 ```matlab % 示例数据集 load fisheriris; % 加载内置的鸢尾花数据集 X = meas; % 特征数据 Y = species; % 类别标签 ``` 2. **数据预处理**: 确保数据已经被正则化或者标准化,因为LDA对各个特征的尺度敏感。 3. **创建模型**: 使用`fitcdiscr`函数构建线性判别分析模型,传入输入变量`X`和目标变量`Y`。 ```matlab ldaModel = fitcdiscr(X, Y); ``` 4. **拟合数据**: 运行模型以拟合数据,得到类别中心、协方差矩阵等信息。 5. **预测**: 可以使用`predict`函数对新的观测值进行分类。 6. **交叉验证**: 如果需要评估模型性能,可以使用`crossvalind`和`kfoldLoss`进行K折交叉验证。 7. **评估性能**: 使用`classificationReport`或`confusionmat`函数生成混淆矩阵,计算准确率、召回率等指标。 8. **结果可视化**: 对于二维或三维的LDA降维后的数据,可以使用`scatter3`或`plotSWD`函数绘制类别之间的分布。 ```matlab scores = predict(ldaModel, X); % 预测得分 figure; scatter3(scores(:,1), scores(:,2), Y, 'filled'); xlabel('First Linear Discriminant'); ylabel('Second Linear Discriminant'); zlabel('Class Index'); ``` 9. **性能测量**: 结果通常会以混淆矩阵的形式展示出来,查看主对角线上的元素(真正例)和非主对角线上元素(误分类),可以计算出精度、查准率(Precision)、查全率(Recall)和F1分数等。 ```matlab confMat = confusionmat(Y, scores); accuracy = sum(diag(confMat))/sum(confMat(:)); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值