【问题标题】:scikit-learn PCA for image dataset用于图像数据集的 scikit-learn PCA
【发布时间】:2019-10-04 19:58:38
【问题描述】:

我正在尝试对一个图像数据集执行 PCA,其中包含 100.000 个图像,每个图像的大小为 224x224x3。

我希望将图像投影到 1000 维(或附近)的空间中。

我在我的笔记本电脑(16gb ram,i7,无 GPU)上执行此操作,并且已经设置了 svd_solver='randomized'

但是,拟合需要很长时间。数据集和图像尺寸是否太大或者我可以使用一些技巧?

谢谢!

编辑:

这是代码:

pca = PCA(n_components=1000, svd_solver='randomized')
pca.fit(X)
Z = pca.transform(X)

X 是一个 100000 x 150528 的矩阵,其行代表一个平面图像。

【问题讨论】:

  • 请提供一些代码来说明您的问题
  • 为什么要将它投影到 1000 维空间?更合理的维度数是 ~5-100
  • 潜在空间不一定是 1000 维,但由于内存限制,它不能大于 5000 或 6000 左右
  • 不过,如果您正在为图像寻找 1000 维空间,那么您可能不应该使用 PCA,而应该使用一些更复杂的特征提取或数据压缩技术。无论如何,您可以查看 fbpca 以获得快速随机 SVD 求解器。我认为没有比密集数据更快的算法了。

标签: python image machine-learning scikit-learn pca


【解决方案1】:

你可以尝试设置

svd_solver="svd_solver"

训练应该快得多。 您也可以尝试使用:

from sklearn.decomposition import FastICA

哪个更具可扩展性 最后的解决方案可能是将您的图像转换为黑白,将尺寸减小 3,如果您的任务不是颜色敏感的(例如光学字符识别),这可能是一个很好的步骤

【讨论】:

    【解决方案2】:

    尝试使用PCA的iterated_power参数

    【讨论】:

    • iterated_power 算法在您期望有大量主成分时并不理想。这样做的原因是收敛速度取决于奇异值之间的差距(它指定了每个主成分解释的方差量)。因此,如果您期望有大量信息丰富的主成分,那么迭代幂法将是低效的。
    【解决方案3】:

    如果您认为需要 1000 个主成分,您应该重新考虑降维的选择。如果你有那么多,那么你就不再具有可解释性,所以你不妨使用其他更灵活的降维算法(例如变分自编码器、t-sne、kernel-PCA)。 PCA 的一个主要优点是主成分的可解释性。

    如果你有同一个地方的视频流,那么你应该可以使用

    此外,对于图像,非负矩阵分解 (NMF) 可能更适合。对于 NMF,您可以执行随机梯度优化,为每个梯度步骤对像素和图像进行二次采样。

    但是,如果您仍然坚持执行 PCA,那么我认为 Facebook 提供的随机求解器是您最好的选择。运行pip install fbpca 并运行以下代码

    from fbpca import pca
    
    # load data into X
    U, s, Vh = pca(X, 1000)
    

    如果不使用某些矩阵结构(例如稀疏性或块组合(您的数据集不太可能具有)。

    另外,如果您需要帮助选择正确数量的主成分,我建议您使用此代码

    import fbpca
    from bisect import bisect_left
    
    def compute_explained_variance(singular_values):
        return np.cumsum(singular_values**2)/np.sum(singular_values**2)
    
    def ideal_number_components(X, wanted_explained_variance):
        singular_values = fbpca.svd(X, compute_uv=False)  # This line is a bottleneck. 
        explained_variance = compute_explained_variance(singular_values)
        return bisect_left(explained_variance, wanted_explained_variance)
    
    def auto_pca(X, wanted_explained_variance):
        num_components = ideal_number_components(X, explained_variance)
        return fbpca.pca(X, num_components)    # This line is a bottleneck if the number of components is high
    

    当然,上面的代码不支持交叉验证,你应该使用交叉验证来选择正确的组件数量。

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 2016-07-13
      • 1970-01-01
      • 2015-02-23
      • 2018-03-23
      • 2013-11-24
      • 2015-04-14
      • 1970-01-01
      • 2022-06-18
      相关资源
      最近更新 更多