2017-04-21 10 views
1

非常に大きな行列にsklearn.decomposition.TruncatedSVDを適用します。行列が特定のサイズ(たとえば350k×25k)を超えると、svd.fit(x)にRAMが不足します。sklearn.decomposition.TruncatedSVDを部分的にマトリックスに適用できますか?

私はsvdを特徴行列に適用します。各行は、単一の画像から抽出された一連の特徴を表します。

メモリの問題を回避するには、svdをマトリックスの一部に適用してから連結しても安全ですか?

結果は同じですか?すなわち:

from sklearn.decomposition import TruncatedSVD 
svd = TruncatedSVD(n_components=128) 
part_1 = svd.fit_transform(features[0:100000, :]) 
part_2 = svd.fit_transform(features[100000:, :]) 
svd_features = np.concatenate((part_1, part_2), axis=0) 

...と等価(?):

from sklearn.decomposition import TruncatedSVD 
svd = TruncatedSVD(n_components=128) 
svd_features = svd.fit_transform(svd_features) 

ない場合は、非常に大きな行列の薄暗い削減のための回避策はありますか?結果は同じではないであろう

答えて

1

、例えば

は、以下のコードを検討:

import numpy as np 
features=np.array([[3, 2, 1, 3, 1], 
     [2, 0, 1, 2, 2], 
     [1, 3, 2, 1, 3], 
     [1, 1, 3, 2, 3], 
     [1, 1, 2, 1, 3]]) 
from sklearn.decomposition import TruncatedSVD 
svd = TruncatedSVD(n_components=2) 
svd = TruncatedSVD(n_components=2) 
part_1 = svd.fit_transform(features[0:2, :]) 
part_2 = svd.fit_transform(features[2:, :]) 
svd_features = np.concatenate((part_1, part_2), axis=0) 
svd_b = TruncatedSVD(n_components=2) 
svd_features_b = svd_b.fit_transform(features) 
print(svd_features) 
print(svd_features_b) 

これは、互いに異なる

[[ 4.81379561 -0.90959982] 
[ 3.36212985 1.30233746] 
[ 4.70088886 1.37354278] 
[ 4.76960857 -1.06524658] 
[ 3.94551566 -0.34876626]] 


[[ 4.17420185 2.47515867] 
[ 3.23525763 0.9479915 ] 
[ 4.53499272 -1.13912762] 
[ 4.69967028 -0.89231578] 
[ 3.81909069 -1.05765576]] 

を印刷します。

+0

ありがとうございます。回避策はありますか? –

+0

@ChrisParryここに関連するものがあるかどうか確認することができます:http://stackoverflow.com/questions/20450051/performing-pca-on-a-large-dataset –

+0

ありがとう、私は "arpack" algoを試しています、私は "無作為化"はメモリの制限内で動作するかもしれないと思う。 –

関連する問題