Sklearn中的PCA内存错误:替代暗淡减少?

时间:2017-04-11 22:53:51

标签: python multidimensional-array scikit-learn pca

我试图在Sklearn中使用PCA来降低非常大的矩阵的维数,但它会产生内存错误(RAM需要超过128GB)。我已经设置了copy = False,而且我正在使用计算成本较低的随机PCA。

有解决方法吗?如果没有,我可以使用哪些其他暗淡减少技术需要更少的内存。谢谢。

更新:我尝试PCA的矩阵是一组特征向量。它来自于通过预训练的CNN传递一组训练图像。矩阵是[300000,51200]。尝试了PCA组件:100到500。

我希望减少其维度,以便我可以使用这些功能来训练ML算法,例如XGBoost。谢谢。

3 个答案:

答案 0 :(得分:6)

最后,我使用了TruncatedSVD而不是PCA,它能够处理没有内存问题的大型矩阵:

from sklearn import decomposition

n_comp = 250
svd = decomposition.TruncatedSVD(n_components=n_comp, algorithm='arpack')
svd.fit(train_features)
print(svd.explained_variance_ratio_.sum())

train_features = svd.transform(train_features)
test_features = svd.transform(test_features)

答案 1 :(得分:0)

您可以使用SK Learn中可用的IncrementalPCAfrom sklearn.decomposition import IncrementalPCA。该界面的其余部分与PCA相同。您需要传递一个额外的参数batch_size,该参数需要<= #components。

但是,如果需要应用诸如KernelPCA之类的非线性版本,则似乎不支持类似的内容。 KernelPCA的内存需求绝对爆炸,请参阅本文about Non Linear Dimensionality Reduction on Wikipedia

答案 2 :(得分:0)

import numpy as np
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version=1)
mnist.target = mnist.target.astype(np.uint8)

# Split data into training and test
X, y = mnist["data"], mnist["target"]
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
del mnist

# Use Incremental PCA to avoid MemoryError: Unable to allocate array with shape
from sklearn.decomposition import IncrementalPCA
m, n = X_train.shape
n_batches = 100
n_components=154

ipca = IncrementalPCA(
    copy=False,
    n_components=n_components,
    batch_size=(m // n_batches)
)
X_train_recuced_ipca = ipca.fit_transform(X_train)