线性判别分析Linear 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


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

《Python数据分析与数据化运营》上市啦!

50+数据流工作知识点
14个数据分析与挖掘主题
8个综合性运营分析案例
涵盖会员、商品、流量、内容4大主题
360°把脉运营问题并贴合数据场景落地


本书主要基于Python实现,其中主要用到的计算库是numpy、pandas和sklearn,其他相关库还包括:
  • 标准库:re、time、datetime、json、 base64、os、sys、cPickle、tarfile
  • 统计分析:Statsmodels
  • 中文处理:结巴分词
  • 文本挖掘:Gensim
  • 爬虫和解析:requests、Beautiful Soup、xml
  • 图像处理:OpenCV和PIL
  • 数据读取:xlrd、pymongo、mysql.connector
  • 数据预处理:imblearn
  • 展示美化类:Matplotlib、graphviz、prettytable、wordcloud、mpl_toolkits、pydotplus
如果你对以下内容感兴趣,那么本书将值得一看:
  • KMeans聚类的自动K均值的确立方法
  • 基于软方法的多分类模型组合评估模型的应用
  • 基于自动下探(下钻、细分)的应用
  • 基于增量学习的多项式贝叶斯分类
  • pipeline管道技术的应用
  • 基于超参数的自动参数值的优化方法
  • 特征自动选择
  • 文本分类、文本主题挖掘
  • 基于自动时间序列ARIMA的P、D、Q的调整
  • python决策树规则输出
  • 基于自定义图像的文本标签云
  • 非结构化数据,例如图像、音频、文本等处理
  • 对象持久化处理
有关这本书的写作感受、详细内容介绍、附件(含数据和代码源文件-源代码可更改数据源直接使用)下载、关键知识和方法以及完整书稿目录,请访问《Python数据分析与数据化运营》新书上线,要购买此书请直接点击图片或扫描二维码去京东购买

《线性判别分析Linear Discriminant Analysis (LDA)》有4个想法

  1. 博主,最近在看LDA,发现好像有两种版本的解释,一是从贝叶斯角度,二是从Fisher判别角度(最大类间距离和最小类内方差),两者的推导结果不大相同。常见的LDA用于降维,一般是从说法二进行说明。我想问一下,到底两者有何关联?谢谢。

  2. 对了,最近我也在学习使用scikit_learn,就LDA这个算法。Fisher判别式会学习到一个转换矩阵w对所有特征向量降维操作,我想问一下,sk的LDA算法能否提取出这个w?

  3. 如果使用LDA做降维的话是怎么使用呢?
    降维后的维度大小是否能够受控(像PCA一样由自己制定特征值归零的个数)?或者只能降维到1,还是说根本无法固定呢?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>