Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python STATSPCA模型特征值和_Python_Pca_Statsmodels - Fatal编程技术网

Python STATSPCA模型特征值和

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.

当我对一些数据应用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.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