Uso de la memoria DBSCAN de scikit-learn

ACTUALIZADO: Al final, la solución que opté por usar para agrupar mi gran conjunto de datos fue una sugerida por Anony-Mousse a continuación. Es decir, usar la implementación DBSCAN de ELKI para hacer mi agrupación en lugar de scikit-learn. Puede ejecutarse desde la línea de comandos y con la indexación adecuada, realiza esta tarea en unas pocas horas. Use la GUI y los pequeños conjuntos de datos de muestra para elaborar las opciones que desea usar y luego ir a la ciudad. Vale la pena mirar en De todos modos, sigue leyendo para obtener una descripción de mi problema original y algunas discusiones interesantes.

Tengo un conjunto de datos con ~ 2.5 millones de muestras, cada una con 35 características (valores de punto flotante) que estoy tratando de agrupar. He estado tratando de hacer esto con la implementación de DBSCAN de scikit-learn, utilizando la métrica de distancia de Manhattan y un valor de épsilon estimado a partir de algunas pequeñas muestras aleatorias extraídas de los datos. Hasta ahora tan bueno. (Aquí está el fragmento, para referencia)

db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)

Mi problema en este momento es que fácilmente me quedo sin memoria. (Actualmente estoy trabajando en una máquina con 16 GB de RAM)

Mi pregunta es, ¿DBSCAN está calculando la matriz de distancia por pares sobre la marcha a medida que se ejecuta, y eso es lo que está engullendo mi memoria? (2.5 millones de ^ 2) * 8 bytes es obviamente estúpidamente grande, lo entendería. ¿No debería estar usando elfit() ¿método? Y, de manera más general, ¿hay alguna forma de solucionar este problema, o estoy generalmente ladrando el árbol equivocado aquí?

Disculpas si la respuesta termina siendo obvia. He estado desconcertado sobre esto por unos días. ¡Gracias!

Anexo: También si alguien pudiera explicar la diferencia entrefit(X) yfit_predict(X) para mí más explícitamente también lo apreciaría, me temo que simplemente no lo entiendo.

Anexo # 2: para estar seguro, simplemente probé esto en una máquina con ~ 550 GB de RAM y aún así explotó, así que siento que DBSCAN probablemente está tratando de hacer una matriz de distancia por pares o algo que claramente no quiero. que hacer. Supongo que ahora la gran pregunta es cómo detener ese comportamiento o encontrar otros métodos que puedan satisfacer mis necesidades. Gracias por estar conmigo aquí.

Addendum # 3 (!): Olvidé adjuntar el rastreo, aquí está,

Traceback (most recent call last):
  File "tDBSCAN.py", line 34, in <module>
    db = DBSCAN(eps=float(sys.argv[2]), min_samples=10, metric='cityblock').fit(mydata)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/base.py", line 329, in fit_predict
    self.fit(X)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 186, in fit
    **self.get_params())
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 69, in dbscan
    D = pairwise_distances(X, metric=metric)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 651, in pairwise_distances
    return func(X, Y, **kwds)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 237, in manhattan_distances
    D = np.abs(X[:, np.newaxis, :] - Y[np.newaxis, :, :])
MemoryError

Respuestas a la pregunta(5)

Su respuesta a la pregunta