2012-01-21 17 views
5

Mam duże (100K przez 30K) i (bardzo) rzadki zbiór danych w formacie svmlight które załadować w następujący sposób:Rzadkie implementacje obliczenia odległości w Pythonie/scikit-learn

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") 

która zwraca rzadki scipy tablica X

I wystarczy obliczyć parami odległości wszystkich punktów szkoleniowych

D = pdist(X) 

niestety implementacje wyznaczania odległości w pracy jedynie scipy.spatial.distance dla gęstych matryc. Ze względu na wielkość zbioru danych jest niemożliwe do, powiedzmy, użyj pdist jak

D = pdist(X.todense()) 

Wszelkie odnośniki do nielicznych wdrożeń wyznaczania odległości matrycy lub obejścia w odniesieniu do tego problemu będzie mile widziana.

Dziękujemy

Odpowiedz

4

W scikit-learn jest sklearn.metrics.euclidean_distances funkcja, która działa zarówno na macierzach rzadkich i gęstych macierzach NumPy. Zobacz reference documentation.

Odległości nieeuklidesowe nie zostały jeszcze zaimplementowane dla rzadkich macierzy.

+0

Dziękuję za odpowiedź. Na początku wydawało mi się to rozwiązaniem mojego problemu, ponieważ "euclidean_distances" działa z rzadkimi danymi, jednak nawet przy 'D = euclidean_distances (X, X)' dostaję błąd braku pamięci. – Nicholas

+0

@Nicholas: 'euclidean_distances' koniecznie zwraca' X.shape [0] '×' X.shape [0] 'gęstą tablicę, która wynosi 1e10 w twoim przypadku. –

+1

@Nicholas, jeśli chcesz zastosować k-średnie na dużym zestawie danych (w kierunku 'X.shape [0]'), powinieneś wypróbować klasę 'sklearn.cluster.MiniBatchKMeans'). Przetwarza on zestaw wejściowy stopniowo małymi porcjami, dzięki czemu kontrolowane jest użycie pamięci. – ogrisel

Powiązane problemy