Sklearn中的PCA内存错误:备选降维方法?

14

我正在使用Sklearn中的PCA来降维一个非常大的矩阵,但是它会产生内存错误(所需的RAM超过128GB)。 我已经设置了copy=False,并且我正在使用计算量较小的随机PCA。

是否有解决方法?如果没有,还有哪些需要更少内存的降维技术可用。谢谢。


更新:我要对这个矩阵进行PCA处理,这个矩阵是由一组训练图像通过预训练的CNN传递而来的特征向量集合。 矩阵的大小为[300000, 51200],尝试用PCA组件将其降至100到500维。

我想降低其维数以便可以使用这些特征来训练ML算法,例如XGBoost。 谢谢。


2
这让我想起了X Y问题。你为什么要减少维度?你试图通过该矩阵实现什么目标?它是一个密集矩阵吗? - iled
1
请提供更多信息:您使用了多少组件,您的输入数据集大小是多少等。 - rth
你可以尝试一些特征降维技术,从数据集中去除冗余或无用的特征。 - semore_1267
你会建议使用哪种特征降维技术?谢谢。 - Chris Parry
我在使用KernelPCA降维时遇到了相同的问题。如何以非线性的方式解决? - Sultan1991
3个回答

9
最终,我使用了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)

6
顺带一提,你是如何计算出正确的结果的呢?据我所知,PCA 会对数据进行中心化处理,这个步骤在使用 TruncatedSVD 时需要手动完成。 - dennlinger

5
您可以使用SK Learn提供的IncrementalPCA。导入方式为 from sklearn.decomposition import IncrementalPCA。其余接口和PCA相同。您需要传递一个额外的参数batch_size,该参数需要小于或等于主成分数量。
然而,如果需要应用非线性版本,例如KernelPCA,似乎没有类似的支持。 KernelPCA在内存需求方面绝对爆炸,有关非线性降维的更多信息,请参见维基百科上的文章:Non Linear Dimensionality Reduction

有人想出了一种运行KernelPCA或类似的非线性PCA的方法吗?即使在小矩阵上,它也需要疯狂的RAM要求... - Moysey Abramowitz

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接