2012-01-21 8 views
5

que tienen un gran tamaño (100 K por 30 K) y (muy) de datos escasa en formato SVMLight la que me carga de la siguiente manera:implementaciones Escasos de cálculos de distancia en Python/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") 

que devuelve un scipy escasa gama X

simplemente necesito para calcular las distancias por pares de todos los puntos de entrenamiento como

D = pdist(X) 

Por desgracia, las implementaciones de cálculo de la distancia en el trabajo sólo se scipy.spatial.distance para matrices densas Debido al tamaño del conjunto de datos no es factible, por ejemplo, utilizar pdist como

D = pdist(X.todense()) 

Cualquier punteros a las implementaciones de cálculo de la distancia matriz dispersa o soluciones con respecto a este problema será apreciado considerablemente.

Muchas gracias

Respuesta

4

En scikit-learn hay una función sklearn.metrics.euclidean_distances que funciona tanto para matrices dispersas y matrices densas numpy. Vea el reference documentation.

Sin embargo, las distancias no euclidianas aún no se implementan para las matrices dispersas.

+0

Gracias por su respuesta. Al principio parecía una solución a mi problema ya que "euclidean_distances" funciona con datos dispersos, sin embargo, incluso con 'D = euclidean_distances (X, X)' recibo un error de falta de memoria. – Nicholas

+0

@Nicholas: 'euclidean_distances' necesariamente devuelve una matriz densa' X.shape [0] '×' X.shape [0] ', que es 1e10 en su caso. –

+1

@Nicholas si desea implementar k-means en un conjunto de datos grande (en la dirección 'X.shape [0]'), debe probar la clase 'sklearn.cluster.MiniBatchKMeans'). Procesa el conjunto de entrada de forma incremental en pequeños fragmentos, por lo que se controla el uso de la memoria. – ogrisel