【发布时间】:2021-04-21 22:42:21
【问题描述】:
我正在使用 PCA 将 Nx3 阵列缩减为 Nx2 阵列。这主要是因为 PCA 变换(Nx2 矩阵)对于在原始 Nx3 数组上执行的旋转或平移是不变的。我们以以下为例。
import numpy as np
from sklearn.decomposition import PCA
a = np.array([[0.5 , 0.5 , 0.5 ],
[0.332, 0.456, 0.751],
[0.224, 0.349, 0.349],
[0.112, 0.314, 0.427]])
pca = PCA(n_components=2, svd_solver='full', random_state=10)
print(pca.fit_transform(a))
以下是输出。请注意,由于平移不变性,我们得到相同的输出,print(pca.fit_transform(a-L))、L 是任意数字。与旋转相同。
[[ 0.16752654 0.15593431]
[ 0.20568992 -0.14688601]
[-0.16899598 0.06364857]
[-0.20422047 -0.07269687]]
现在,我对数组 a 进行非常小的扰动 (~1%) 并执行 PCA。
a_p = np.array([[0.51 , 0.53 , 0.52 ],
[0.322, 0.452, 0.741],
[0.217, 0.342, 0.339],
[0.116, 0.31 , 0.417]])
pca = PCA(n_components=2, svd_solver='full', random_state=10)
print(pca.fit_transform(a_p))
结果如下。这与原始数组的 PCA 有很大的不同。
[[-0.2056024 , -0.14346977]
[-0.18563578 0.15627932]
[ 0.17974942 -0.07001969]
[ 0.21148876 0.05721014]]
我预计扰动数组的 PCA 变换与原始数组的 PCA 变换非常相似,但百分比变化很大。为什么是这样?有什么方法可以让我得到一个非常相似的 PCA 转换,用于稍微扰动/摇晃的数组?
我知道我可以通过在第二种情况下仅执行变换操作来获得类似的 PCA(例如pca.transform(a_p)),但是,在这种情况下,我失去了旋转和平移不变性 w.r.t。 a_p.
这个问题最初与晶体学有关,我的要求是 PCA(或其他)变换不应显着改变为输入的微小变化,并且它应该对输入的旋转和变换保持不变。任何人都可以解释上述内容或向我建议一种符合我目的的替代方法吗?
【问题讨论】:
-
"1% perturbation" 听起来像是一个很小的变化,但请注意,它通过打破第 0 行 [0.5 , 0.5 , 0.5] 和第 2 行 [0.224, 0.349, 0.349] 到 [0.217, 0.342, 0.339]。
标签: python pca dimensionality-reduction