2012-01-21 193 views
5

我有一個大的(100K由30K)和(非常)在svmlight格式稀疏數據集,其餘加載如下:稀疏實現/ scikit學習

import numpy as np 
from scipy.cluster.vq import kmeans2 
from scipy.spatial.distance import pdist, squareform 
from sklearn.datasets import load_svmlight_file 

X,Y = load_svmlight_file("somefile_svm.txt") 

它返回一個稀疏SciPy的陣列X

我只需要計算所有培訓點的成對距離爲

D = pdist(X) 

不幸的是,距離計算的實現只scipy.spatial.distance工作對於密集矩陣。由於該數據集的大小是不可行的,比方說,使用pdist作爲

D = pdist(X.todense()) 

任何指針稀疏矩陣距離計算的實現方式或解決方法與關於這個問題,將不勝感激。

非常感謝

回答

4

在scikit學習有一個sklearn.metrics.euclidean_distances函數,該函數用於稀疏矩陣和密集numpy的陣列工作。請參閱reference documentation

但是對於稀疏矩陣還沒有實現非歐幾里得距離。

+0

謝謝你的回答。起初,它似乎解決了我的問題,因爲「euclidean_distances」適用於稀疏數據,但即使使用'D = euclidean_distances(X,X)',我也會遇到內存不足錯誤。 – Nicholas

+0

@Nicholas:'euclidean_distances'必然返回一個'X.shape [0]'×'X.shape [0]'密集數組,在你的情況下是1e10。 –

+1

@Nicholas如果你想在大數據集上實現k-means(在'X.shape [0]'方向),你應該試試'sklearn.cluster.MiniBatchKMeans'類。它通過小塊逐步處理輸入集,從而控制內存使用量。 – ogrisel