Scikit-Learn-DBSCAN-Speichernutzung

AKTUALISIERTE: Am Ende war die Lösung, die ich für das Clustering meines großen Datensatzes gewählt habe, eine von Anony-Mousse unten vorgeschlagene. Das heißt, ich verwende die DBSCAN-Implimentation von ELKI, um mein Clustering durchzuführen, anstatt die von Scikit-Learns. Es kann über die Befehlszeile ausgeführt werden und führt diese Aufgabe bei richtiger Indizierung innerhalb weniger Stunden aus. Verwenden Sie die GUI und kleine Beispieldatensätze, um die Optionen zu ermitteln, die Sie verwenden möchten, und fahren Sie dann in die Stadt. Einen Blick wert. Wie auch immer, lesen Sie weiter, um eine Beschreibung meines ursprünglichen Problems und einige interessante Diskussionen zu erhalten.

Ich habe einen Datensatz mit ca. 2,5 Millionen Stichproben mit jeweils 35 Merkmalen (Gleitkommawerten), die ich zu gruppieren versuche. Ich habe versucht, dies mit der Implementierung von DBSCAN durch scikit-learn zu tun, wobei die Manhattan-Distanzmetrik und ein Wert von epsilon verwendet wurden, der aus einigen kleinen Zufallsstichproben geschätzt wurde, die aus den Daten gezogen wurden. So weit, ist es gut. (Hier ist das Snippet als Referenz)

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

Mein Problem im Moment ist, dass mir leicht der Speicher ausgeht. (Ich arbeite derzeit an einem Computer mit 16 GB RAM)

Meine Frage ist, berechnet DBSCAN die paarweise Distanzmatrix im laufenden Betrieb und verschlingt dadurch mein Gedächtnis? (2,5 Millionen ^ 2) * 8 Bytes ist natürlich blöd groß, das würde ich verstehen. Sollte ich das nicht benutzen?fit() Methode? Und im Allgemeinen gibt es einen Weg, um dieses Problem zu umgehen, oder belle ich hier im Allgemeinen den falschen Baum an?

Entschuldigung, wenn die Antwort offensichtlich wird. Ich habe ein paar Tage darüber gerätselt. Vielen Dank!

Nachtrag: Auch wenn jemand den Unterschied erklären könntefit(X) undfit_predict(X) für mich würde ich mich auch darüber freuen - ich fürchte, ich verstehe es einfach nicht ganz.

Nachtrag Nr. 2: Um sicher zu sein, habe ich dies gerade auf einem Computer mit ~ 550 GB RAM versucht und es ist immer noch in die Luft gesprengt, sodass ich denke, dass DBSCAN wahrscheinlich versucht, eine paarweise Distanzmatrix oder etwas zu erstellen, was ich eindeutig nicht will machen. Ich denke, jetzt ist die große Frage, wie man dieses Verhalten stoppen oder andere Methoden finden kann, die meinen Bedürfnissen besser entsprechen. Danke, dass du hier mit mir gesprochen hast.

Nachtrag Nr. 3 (!): Ich habe vergessen, den Traceback anzuhängen, hier ist es,

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

Antworten auf die Frage(5)

Ihre Antwort auf die Frage