难以理解 PCA 如何实现图像压缩和降维

Trouble in understanding how PCA is achieving image compression and reducing dimension

我在 YouTube 上浏览了 this Steve Brunton 的精彩 SVD 播放列表。我想我掌握了大部分概念,但还有一些差距。让我添加几个屏幕截图,以便我更容易解释。

他认为输入矩阵 X 是一组图像。因此,考虑到图像是 28x28 像素,我们将其展平以创建 784x1 列向量。因此,每一列表示一个图像,行表示像素索引。让我们将 X 的维度设为 n x m。现在,在计算经济 SVD 之后,如果我们只保留前 r (<< m) 个奇异值,则给出 X 的近似值通过

X' = σ1.u1.v1(T) + σ2.u2.v2(T) + ... + σr.ur.vr(T)

据我所知,我们在这里丢弃了信息,因此重建的图像将被像素化,但它们仍然具有相同的尺寸 (28x28)。那么,我们如何在这里实现压缩?是因为不是存储 784m 像素值,我们必须存储 r x (28 (每个 u 的长度) + 28 (每个 v[=46 的长度=])) 像素?或者还有更多内容?

我的第二个问题是,如果我尝试类比数字特征,例如假设一个房价数据集有 50 个特征和 1000 个数据点。因此,我们的 X 矩阵的维度为 50 x 1000(每一列都是一个特征向量)。在那种情况下,如果有无用的特征,我们将在应用 PCA 后得到 << 50 个特征(可能是 20 个,或 10 个......等等),对吧?当我们 select 只有最大的 r 个奇异值时,我无法理解如何导出较小的特征向量。因为 XX' 具有相同的维度。

让我们来一个示例代码。由于 sklearn 的预期,维度被颠倒了。

pca = PCA(n_components=10)
pca.fit(X)
X_pca = pca.transform(X)
print("original shape:   ", X.shape)      # original shape:    (1000, 50)
print("transformed shape:", X_pca.shape)  # transformed shape: (1000, 10)

那么,我们如何从 50 到 10?我知道在这种情况下会有 50 个 U 基向量。所以,即使我们从这 50 个中选择 top r,维度仍然是一样的,对吧?感谢任何帮助。

我一直在网上寻找答案,当我看到 this 视频教程时,终于点击了。我们知道 X = U x x V.T。这里,U 的列为我们提供了 X 的 colspace 的主成分。类似地,V.T 行为我们提供了 X 行 space 的主要成分。因为,在 pca 中,我们倾向于用一行表示特征向量(与 svd 不同),所以我们 select 来自矩阵 V.T[=34= 的前 r 个主成分].

我们假设 X 的维度是 mxn。因此,我们有 m 个样本,每个样本都有 n 个特征。这为我们提供了以下 SVD 维度:

  • 你:mxm
  • ∑: mxn
  • V: nxn

现在,如果我们 select 只有 r (<< n) 个主成分,那么 X 到 r 维 space 的投影将是由 X.[v1 v2 ... vr] 给出。这里的每一个 v1, v2, ... vr 都是一个列向量。所以,[v1 v2 ... vr] 的维度是 nxr。如果我们现在将 X 与这个向量相乘,我们会得到一个 nxr 矩阵,它只是所有数据点到 r 维的投影。