• 【转载】主成分分析法(PCA)


    https://www.jisilu.cn/question/252942

    进行维数约减(Dimensionality Reduction),目前最常用的算法是主成分分析法 (Principal Componet Analysis, PCA)

    使用主成分分析法进行数据的降维处理,具体的原理和过程是怎么样的呢?

    下面让我一一道来。

    1 信息损失最少

    例如这样一些二维数据:



    我们想要将数据降到一维,到底是图中的红线好呢还是绿线好呢?



    降维就意味着信息的丢失,我们需要做的,就是尽可能将这样的信息损失降低。





    我们可以很直观地看到,数据点和直线的距离就在降维的过程中丢失掉了。

    显然,绿线丢失的数据要比红线多。

    所以,我们可以判断,使用红线相比绿线会更好。

    我们也注意到,投影到红线上的蓝点,离散的程度大于投影到绿线上的蓝点,这也从另一个角度说明投影到红线丢失的信息相对更少。

    这个离散的程度,我们使用蓝点之间的方差进行衡量:



    其中:



    为了方便计算,我们将所有的特征都减去该特征的均值,并依然用 a<sub>i</sub> 来表示,所以蓝点之间的方差可以记为:


    2 特征不相关

    上面是二维降为一维的情况,只需要找到使得方差最大化的一个向量就可以了:



    但是对于更高的维度,应该如何处理呢?例如三维降为二维。

    当然我们可以首先找到一个使得投影方差最大方向,然后在这个基础上,找到和这个方向不相关的另外一个使得投影方差最大的方向。

    所谓的不相关,就是指第二个方向向量和第一个方向向量正交,体现在二维平面上就是垂直的关系:



    我们先找到了使得投影方差最大方向,其方向向量为 u<sup>(1)</sup> ,然后找到了和它垂直的投影方差最大的方向,其方向向量为 u<sup>(2)</sup> 。

    这里两个方向的相关程度,我们使用协方差进行衡量:



    这里的 a, b 均已减去特征的均值。

    当协方差 Cov(a,b) = 0 的时候,两个特征向量正交,也就是两个特征不相关。

    3 PCA的推导过程

    假设我们的训练数据有 m 行数据,有 n 个特征维度,那么矩阵 X 是一个 m × n 的矩阵,可以表达为:



    X 的协方差矩阵 C 可以通过以下公式得到:



    那么 C 为一个 n × n 的矩阵:



    可以直观地看到,协方差矩阵 C 是一个对称矩阵,C<sub>ij</sub> = C<sub>ji</sub> ,对角线是各个特征的方差。

    因为矩阵 C 是一个实对称矩阵,所以 C 也具备一些实对称矩阵的特征:

    C 的不同特征值对应的特征向量是正交的;
    C 的特征值都是实数,特征向量都是实向量;
    C 可对角化,且相似对角阵上的元素即为矩阵本身特征值。

    根据这些性质,我们可以得到 n 个线性无关的非零特征向量 e<sub>1</sub>, e<sub>2</sub>, … , e<sub>n</sub> ,这些特征向量构成的特征矩阵 E = ( e<sub>1</sub> e<sub>2</sub> … e<sub>n</sub> ) 满足:



    Λ 是一个对角矩阵,除了对角线有值,其他位置(空白处)都是 0 。

    对于特征矩阵 X ,因为可能存在大量的冗余数据,我们将它转换到另外一个特征空间,得到新的特征矩阵 Z:



    我们希望这个特征空间中各个特征的彼此是线性无关的,也就是说希望各个特征向量是正交关系。

    那么在新的特征空间中,其协方差矩阵应该是一个对角矩阵:



    对角线是方差,其他位置(空白处)是协方差。协方差为 0 ,代表着两个向量正交。

    假设特征空间转换的过程可以表达为 Z = XU ,矩阵 D 代入该表达式可以得到:



    也就是说 U = E ,U 就是矩阵 C 特征向量所组成的矩阵。矩阵 D 对角线上每个值就是矩阵 C 的特征值

    如果我们把 D 中的特征值按照从大到小,将特征向量从左到右进行排序,然后取其中前 k 个,经过压缩转换(Z = XU),就得到了我们降维之后的数据矩阵 Z :



    X 是 m × n 的矩阵, U 是 n × k 的矩阵,Z 是 m × k 的矩阵。

    4 PCA的计算过程

    第一步:首先对特征进行归一化处理。



    第二步:计算协方差矩阵。



    第三步:计算协方差矩阵的特征向量并按照特征大从大到小排序。



    第四步:提取特征向量矩阵的前 k 列。



    第五步:通过矩阵乘法计算得到新的特征 Z 。其中计算的公式为:



    至此我们算是完成了降维。

    5 特征数 k 的选择

    不过有时候,降维的效果可能并不好。要么可能维度压缩不多,内存占用和计算速度依然没有改善,要么可能维度压缩太过,信息丢失太大。

    这其实取决于特征数 k 的选择。

    因为矩阵 U 中每个特征向量是相互正交的,矩阵 U 也是一个正交矩阵,所以有 UU<sup>T</sup> = E , E 为单位矩阵。

    经过如下推导,我们可以反压缩得到矩阵 X:



    因为保留的特征数 k 小于 m,所以这个反压缩得到的结果是不等于 X 的。

    例如一维还原到二维,最终反压缩得到的结果是:



    而不是:



    这是因为特征转换的过程中,丢失了一部分的信息。

    所以使用 X<sub>approx</sub> 进行标记更加合适:



    有了 X<sub>approx</sub> ,其实我们就能计算信息丢失率:



    如果损失小于 1%,那么我们可以说保留了 99% 的差异性。

    当然,差异性的百分比还有另外一个获得,那就是前 k 个特征值之和除以所有的特征值之和。

    因为我们已经对特征值进行了降序排序,所以前面 k 个特征应该能够比较好的代表全部的特征。

    注意,这个特征值是指对角矩阵对角线上的数值:



    如果对于每个特征值,我们使用 S<sub>ii</sub> 进行标记,那么公式就是:



    大于 k 小于 m 部分的特征值,就是丢失的数据,所以信息丢失率也可以通过下面的公式计算:



    我们需要做的,是设置一个差异性保留的百分比,然后从小到大对 k 进行遍历,差异性满足条件,k 就是我们要的结果。

    例如计算得到的数据差异性百分比和 k 的关系如下:

    k = 1 :60%
    k = 2 :77%
    k = 3 :88%
    k = 4 :93%
    k = 5 :97%
    k = 6 :99%

    如果我们要保留 90% 的数据,那么 k 的取值应该是 4 ;
    如果我们要保留 99% 的数据,那么 k 的取值应该是 6 。

    6 关于PCA的注意事项

    注意一:如果使用了PCA对训练集的数据进行了处理,那么对于验证集和测试集也需要进行相对应的处理。

    我们在处理训练集的过程中得到了特征的均值 μ 和方差 σ ,以及特征向量 U ,我们需要使用这些参数先对数据进行归一化处理,然后转换到新的特征空间。

    注意二:在使用PCA进行压缩之前,先使用原数据进行训练,这样我们才能对比压缩前后的效果。

    如果不是占用内存空间太大,或者算法运行速度过慢,其实没有必要进行压缩。

    注意三:不要使用PCA来避免过度拟合。

    因为通过这样的方式皮避免度拟合,不仅效果很差,并且会丢失部分数据。

  • 相关阅读:
    Java实现 LeetCode 394 字符串解码
    Java实现 LeetCode 394 字符串解码
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 390 消除游戏
    Java实现 LeetCode 390 消除游戏
  • 原文地址:https://www.cnblogs.com/jincwfly/p/9245981.html
Copyright © 2020-2023  润新知