特征工程 | LDA降维

  • 2020 年 2 月 25 日
  • 筆記

喜欢就点击上面↑蓝色字体关注我们!

判别分析是一种分类算法,并且也可作为降维技术使用。判别方法有距离判别、贝叶斯判别、Fisher判别等。而Fisher判别是最常用的方法,其基本思想是将p维数据投影到某一方向,使得组之间的投影尽可能的分开。

Fisher判别算法

假设有k个总体

,数据维度为p,k个总体的样本大小分别为

,总样本大小为

,样本如下:

令a为任一p维非零向量,其作为投影的方向,则将x向a方向投影后的结果为

。那么上述样本按照方向a投影后可得:

投影后的数据变为一维数据,借用方差分析的思想,使组间偏差/组内偏差最大化的a方向即为投影方向。

组间偏差平方和:

组内偏差平方和:

即求下列优化问题:

求解证明过程:

判别规则:

LDA降维

从上面判别函数的求解过程可以看出,最终得到的判别函数是将最大特征值对应的特征向量作为判别函数的系数,此判别函数的判别效力最优,亦称为第一判别函数,根据特征值的大小,依次可以得到第二判别函数,…,第p判别函数,且判别效力依次降低。和PCA同理,保留前几个判别函数作为投影方向,可以实现降维的效果,所不同的是PCA是无监督方法,而LDA是有监督方法。

以iris数据集为例,简单看看python如何使用判别分析构建新特征,更详细用法可以参考官方文档。

from sklearn.datasets import load_iris  import numpy as np    # 加载数据集  iris = load_iris()  iris_X, iris_y = iris.data, iris.target    # 线性判别  from sklearn.discriminant_analysis import LinearDiscriminantAnalysis  lda = LinearDiscriminantAnalysis(n_components=2)  lda.fit(iris_X, iris_y) # 拟合  lda.scalings_ # 列是特征向量,即变换系数  # Out[1]:  # array([[-0.81926852,  0.03285975],  #        [-1.5478732 ,  2.15471106],  #        [ 2.18494056, -0.93024679],  #        [ 2.85385002,  2.8060046 ]])    # 数据转换,生成新特征  iris_trans = np.dot(iris_X, lda.scalings_)    # 查看变换后的新特征的相关性:新特征之间相关系数为0  np.corrcoef(iris_trans.T)  # Out[2]:  # array([[1.00000000e+00, 2.32995697e-17],  #        [2.32995697e-17, 1.00000000e+00]])    # 新特征解释原数据信息的比例:第一个新特征解释了原数据99.15%的信息  lda.explained_variance_ratio_  # Out[2]: array([0.99147248, 0.00852752])