AGGIORNATO: Alla fine, la soluzione che ho scelto di utilizzare per raggruppare il mio grande set di dati è stata suggerita da Anony-Mousse di seguito. Cioè, usando l'impiantazione DBSCAN di ELKI per fare il mio clustering piuttosto che scikit-learn. Può essere eseguito dalla riga di comando e con indicizzazione corretta, esegue questa attività entro poche ore. Usa la GUI e piccoli set di dati campione per elaborare le opzioni che desideri utilizzare e poi andare in città. Vale la pena esaminare. Chiunque, continua a leggere per una descrizione del mio problema originale e qualche discussione interessante.scikit-learn DBSCAN utilizzo della memoria
Ho un set di dati con ~ 2,5 milioni di campioni, ciascuno con 35 funzioni (valori in virgola mobile) che sto cercando di raggruppare. Ho cercato di farlo con l'implementazione di DBSCAN di scikit-learn, utilizzando la metrica di distanza di Manhattan e un valore di epsilon stimato da alcuni piccoli campioni casuali tratti dai dati. Fin qui tutto bene. (Qui è il frammento di, per riferimento)
db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)
Il mio problema in questo momento è che ho facilmente a corto di memoria. (Attualmente sto lavorando su una macchina con 16 GB di RAM)
La mia domanda è, è DBSCAN che calcola la matrice della distanza in coppia al volo mentre corre, e questo è ciò che mi sta assorbendo la memoria? (2,5 milioni^2) * 8 byte è ovviamente stupidamente grande, lo capisco. Non dovrei usare il metodo fit()
? E più in generale, c'è un modo per aggirare questo problema, o sto generalmente abbaiando dall'albero sbagliato qui?
Ci scusiamo se la risposta si rivela evidente. Ci sono rimasto perplesso per alcuni giorni. Grazie!
Addendum: Anche se qualcuno potrebbe spiegare la differenza tra fit(X)
e fit_predict(X)
a me più esplicitamente Vorrei anche apprezzato che - temo solo che non riesce quasi mai esso.
Addendum n. 2: Per essere sicuri, ho appena provato questo su una macchina con ~ 550 GB di RAM e si è ancora fatto esplodere, quindi mi sento come se DBSCAN stia tentando di creare una matrice a distanza di coppia o qualcosa che indosso chiaramente lo voglio fare Immagino che ora la grande domanda sia come fermare quel comportamento, o trovare altri metodi che potrebbero soddisfare di più le mie esigenze. Grazie per aver portato con me qui.
Addendum # 3 (!): Ho dimenticato di allegare il traceback, eccolo,
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
In realtà sembra che non sarebbe troppo difficile migliorare l'implementazione di sklearn. Abbiamo una struttura dati ad albero di sfere che supporta esattamente la query raggio. Non ho molta dimestichezza con dbscan quindi non sapevo che servissero solo queste domande. Dovremmo sicuramente migliorare lì. –
Sì, non dovrebbe essere troppo difficile risolvere questo problema con sklearn. –
Una migliore implementazione di DBSCAN sarebbe eccezionale. –