Python STATSPCA模型特征值和
当我对一些数据应用statsmodels.multivariable.pca.pca时,我发现产生的特征值之和不等于数据的总方差。我正在使用以下代码Python STATSPCA模型特征值和,python,pca,statsmodels,Python,Pca,Statsmodels,当我对一些数据应用statsmodels.multivariable.pca.pca时,我发现产生的特征值之和不等于数据的总方差。我正在使用以下代码 将numpy导入为np 将statsmodels.api作为sm导入 corr_矩阵=np数组([ [1, 0.8, 0.4], [0.8, 1, 0.6], [0.4, 0.6, 1]]) Z=np.随机多变量正态分布([0,0,0],corr,1000) pc=sm.PCA(Z,标准化=False,降级=False,标准化=False) pc.
将numpy导入为np
将statsmodels.api作为sm导入
corr_矩阵=np数组([
[1, 0.8, 0.4],
[0.8, 1, 0.6],
[0.4, 0.6, 1]])
Z=np.随机多变量正态分布([0,0,0],corr,1000)
pc=sm.PCA(Z,标准化=False,降级=False,标准化=False)
pc.eigenvals.sum()
结果(在一个给定的随机样本中)是2994.51488403581
,而我希望这加起来是3
我错过了什么
添加1
似乎当对数据
X
(即使用矩阵X^TX
)执行PCA时,方差和特征值之间的关系不再成立,只有在对协方差矩阵(即X^TX/n
)执行PCA时,当特征值和等于方差和时,即跟踪(X^TX/n)=和(特征值)
。我希望在PCA的所有post one发现中能更清楚地说明这一点。特征值不是数据的方差。特征值是数据在特定方向上的方差,由特征向量定义。数据的方差是所有点到数据平均值的距离之和。PC是数据的特征,显示数据如何在空间中以特定方向扩展。您不应该将数据的方差与特征值(显示特征向量方向的方差)混淆。通过逆向工程快速回答(我不记得细节)
在计算方差时,数据被降级。如果我们不贬低,那么我们只得到一个非中心二次积
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
谢谢你的回答,但是我看到到处都写着,PCA的特征值之和等于总方差,这不是数据的总方差,而是每个变量/维度的方差之和。这就是为什么PC的和等于协方差矩阵的轨迹。协方差矩阵的对角线有每个变量的方差值。是的,据我所知,这就是所谓的
总方差
——单个方差的总和,即协方差矩阵的轨迹。当PCA应用于数据时,似乎缺少了一些归一化(观察的数值?),这与特征值的关系保持不变,但似乎没有在任何地方讨论。我不认为数据的方差是所有维度方差的总和。当数据为白色(所有依赖项和交叉方差均为0,协方差矩阵为对角)时,这可能是正确的。我建议尝试计算cov矩阵的轨迹。如果它与特征值之和不一样,那么你在代码中犯了一个错误。
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