我试图在Sklearn中使用PCA来降低非常大的矩阵的维数,但它会产生内存错误(RAM需要超过128GB)。我已经设置了copy = False,而且我正在使用计算成本较低的随机PCA。
有解决方法吗?如果没有,我可以使用哪些其他暗淡减少技术需要更少的内存。谢谢。
更新:我尝试PCA的矩阵是一组特征向量。它来自于通过预训练的CNN传递一组训练图像。矩阵是[300000,51200]。尝试了PCA组件:100到500。
我希望减少其维度,以便我可以使用这些功能来训练ML算法,例如XGBoost。谢谢。
答案 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中可用的IncrementalPCA
。 from 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)