首页 > 解决方案 > PCA 不会降低我的数据的维数

问题描述

我想将 PCA 应用于 18 维的热图。

dim(heatmaps)=(224,224,18)

由于 PCA 仅采用 dim <= 2 的数据。我将热图重塑如下:

heatmaps=heatmaps.reshape(-1,18)
heatmaps.shape
(50176, 18)

现在,我将应用 PCA 并采用保留 95% 方差的第一个组件。

from sklearn.decomposition import PCA
pca = PCA(n_components=18)
reduced_heatmaps=pca.transform(heatmaps)

但是 的尺寸reduced_heatmaps与原始尺寸相同heatmaps(50176, 18)。

我的问题如下:如何在保留 95% 的方差的同时减少热图的维度?

奇怪的事情

pca.explained_variance_ratio_.cumsum()
array([ 0.05744624,  0.11482341,  0.17167621,  0.22837643,  0.284996  ,
        0.34127299,  0.39716828,  0.45296374,  0.50849681,  0.56382308,
        0.61910508,  0.67425335,  0.72897448,  0.78361028,  0.83813329,
        0.89247688,  0.94636864,  1.        ])

这意味着,我需要保留 17 个组件来减少我的数据的维度,这样我就有 18 个维度。

怎么了 ?

编辑:遵循 Eric Yang 的建议

heatmaps=heatmaps.reshape(18,-1)
heatmaps.shape
(18,50176)

然后应用 PCA 如下:

pca = PCA(n_components=11)
reduced_heatmaps=pca.fit_transform(heatmaps)
pca.explained_variance_ratio_.cumsum()
results the following : 
array([ 0.21121199,  0.33070526,  0.44827572,  0.55748779,  0.64454442,
        0.72588593,  0.7933346 ,  0.85083687,  0.89990991,  0.9306283 ,
        0.9596194 ], dtype=float32)

需要 11 个组件来解释我的数据的 95% 方差。

reduced_heatmaps.shape
(18, 11)

因此我们从 (18,50176) 到 (18, 11)

谢谢您的帮助

标签: python-2.7scikit-learnheatmappca

解决方案


减少方差的能力取决于您的数据。如果您有一个每个维度为 N(0,1) 的 N 维高斯,每个维度将解释您的方差的 1/N,因此您通过 PCA 减少维度的能力将是最小的。所以PCA的结果似乎并没有错。

现在基于对您问题的肤浅理解,您有 18 张 224x224 的图像是否正确?如果这是正确的,那么你的维度是 224x224 而不是 18。所以你想问我的图像中解释我的 18 个图像之间差异的最小像素数是多少。(但是,如果这不是假设,我可能是错的,而您所拥有的是 18 个通道用于 1 张图像)

还有另一种可能性,您有一系列相似的图像(因此您的维度将是 18),并且您正在寻找 Eigen 图像。如果图像差异太大,您将在维度上进行最小程度的降低。


推荐阅读