python-2.7 - 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)
谢谢您的帮助
解决方案
减少方差的能力取决于您的数据。如果您有一个每个维度为 N(0,1) 的 N 维高斯,每个维度将解释您的方差的 1/N,因此您通过 PCA 减少维度的能力将是最小的。所以PCA的结果似乎并没有错。
现在基于对您问题的肤浅理解,您有 18 张 224x224 的图像是否正确?如果这是正确的,那么你的维度是 224x224 而不是 18。所以你想问我的图像中解释我的 18 个图像之间差异的最小像素数是多少。(但是,如果这不是假设,我可能是错的,而您所拥有的是 18 个通道用于 1 张图像)
还有另一种可能性,您有一系列相似的图像(因此您的维度将是 18),并且您正在寻找 Eigen 图像。如果图像差异太大,您将在维度上进行最小程度的降低。
推荐阅读
- node.js - MongoDB .find() 等效于 SELECT 行 WHERE 字段 = 值
- python - TypeError:“NoneType”类型的对象在应用程序部署中没有 len() Python
- c# - Swashbuckle.AspNetCore (5.0.0-rc5) 忽略公共字段
- yii - SQL查询到yii 1.1参数化查询
- r - dbplyr Oracle 别名限制数据库
- php - 模型实例不返回方法
- java - stanford corenlp java 类 jar 文件编译缺少 '.'
- entity-framework - 在预订应用程序中使用实体框架编写查询以搜索可用房间
- python - 只有一个表达式的两个 REGEX 操作
- windows - 用于循环启动应用程序的 Windows 批处理脚本