GPflow和Sklearn计算的PCA不匹配

2024-04-25 02:06:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用SklearnGPflow执行PCA分析。我注意到两个库返回的输出不匹配。你知道吗

请参见下面的示例代码片段-

import numpy as np
from gpflow.models import PCA_reduce
from sklearn.decomposition import PCA

X = np.random.random((100, 10))

for n in range(1, 6):
    X1 = PCA(n_components=n).fit_transform(X)
    X2 = PCA_reduce(X, n)
    print('[n=%d] allclose=%s' % (n, np.allclose(X1, X2)))

下面是输出-

[n=1] allclose=True
[n=2] allclose=False
[n=3] allclose=False
[n=4] allclose=False
[n=5] allclose=False

仅当主成分数为1时匹配。为什么会有这样的行为?


Tags: 代码fromimportnumpyfalse示例reducenp
1条回答
网友
1楼 · 发布于 2024-04-25 02:06:17

这里有两个不同的问题:

  1. 两种方法的特征值顺序相反。在sklearn实现中,特征向量是通过降低其特征值的幅度来排序的,而在gpflow实现中,它们是通过增加幅度来排序的。特别是,您应该比较PCA(n).fit_transform(X)PCA_reduce(X, n)[:, ::-1]。当然,这也解释了为什么只使用一个组件就能得到预期的效果。

  2. 然而,这本身是不够的:如果$v$是具有给定特征值的长度为1的特征向量,那么$v$也是,因此不能简单地使用np.allclose来确定结果是否一致;您需要考虑潜在的反转。所以,你可以用a = np.all(np.isclose(X1, X2), 0)来直接比较向量,b = np.all(np.isclose(X1, -X2), 0)(注意减号)来比较它们,当X2中的所有向量都反转时,从那时起,a | b就成了它们同意反转的条件。最后,np.all(a | b)将检查每个特征向量是否成立。

事实上,对测试的以下修改会给出所有正确的答案:

In [74]: for n in range(1, 6):
    ...:     X1 = PCA(n_components=n).fit_transform(X)
    ...:     X2 = PCA_reduce(X, n)[:, ::-1]
    ...:     print('[n=%d] allclose=%s' % (n, np.all(np.all(np.isclose(X1, X2), 0) | np.all(np.isclose(X1, -X2), 0))))

[n=1] allclose=True
[n=2] allclose=True
[n=3] allclose=True
[n=4] allclose=True
[n=5] allclose=True

相关问题 更多 >