【问题标题】:statsmodels PCA eigenvalues sumstatsmodels PCA 特征值总和
【发布时间】:2020-04-23 02:16:34
【问题描述】:

当我将statsmodels.multivariate.pca.PCA 应用于某些数据时,我发现生成的特征值之和不等于数据的总方差。我正在使用以下代码

import numpy as np
import statsmodels.api as sm

corr_matrix = np.array([
    [1, 0.8, 0.4],
    [0.8, 1, 0.6],
    [0.4, 0.6, 1]])

Z = np.random.multivariate_normal([0,0,0], corr, 1000)

pc = sm.PCA(Z, standardize=False, demean=False, normalize=False)

pc.eigenvals.sum()

结果(在给定的随机样本中)是2994.51488403581,而我希望这加起来是3

我错过了什么?

加1

似乎当对数据X(即使用矩阵X^TX)进行PCA时,方差和与特征值之间的关系不再成立,只有在对数据进行PCA时当特征值之和等于方差之和时,协方差矩阵(即X^TX/n),即trace(X^TX/n) = sum(eigenvalues)。我希望在 PCA 上发现的所有帖子中都能更清楚地说明这一点。

【问题讨论】:

    标签: python pca statsmodels


    【解决方案1】:

    特征值不是数据的方差。特征值是数据在特定方向上的方差,由特征向量定义。数据的方差是所有点到数据平均值的距离之和。 PC 是数据的特征,显示数据在空间中如何在特定方向上扩展。您不应将数据的方差与特征值(显示特征向量方向的方差)混淆。

    【讨论】:

    • 谢谢你的回答,但我看到到处都写着the sum of eigenvalues from PCA equals the total variance...
    • 这不是数据的总方差,而是每个变量/维度的方差之和。这就是为什么 PC 的总和等于协方差矩阵的迹。协方差矩阵的对角线具有每个变量的方差值。
    • 是的,据我所知,这就是所谓的total variance - 个体方差的总和,即协方差矩阵的轨迹。当 PCA 应用于数据以保持这种与特征值的关系时,似乎缺少一些归一化(观察次数?),但似乎没有在任何地方讨论。
    • here。我不认为数据的方差是每个维度的所有方差的总和。当数据为白色时,这可能是正确的(所有依赖项和交叉方差均为 0,协方差矩阵为对角线)。
    • 我建议尝试计算 cov 矩阵的迹线。如果它与特征值之和不同,那么您的代码就出错了。
    【解决方案2】:

    逆向工程快速回答(我不记得细节了)

    pc = PCA(Z, standardize=False, demean=True, normalize=False)
    ​
    pc.eigenvals.sum() / 1000
    2.7550787264061087
    
    Z.var(0).sum()
    2.7550787264061087
    

    在计算方差时,数据被贬低。如果我们不贬低,那么我们只会得到一个非中心的二次积。

    pc = PCA(Z, standardize=False, demean=False, normalize=False)
    ​
    pc.eigenvals.sum(), pc.eigenvals.sum() / Z.shape[0]
    (2756.1915877060546, 2.7561915877060548)
    
    (Z**2).mean(0).sum()
    2.7561915877060548
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 2015-11-01
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 2016-10-11
      相关资源
      最近更新 更多