scikit-learn Wykorzystanie pamięci DBSCAN

AKTUALIZOWANE: Ostatecznie rozwiązaniem, które wybrałem do grupowania mojego dużego zestawu danych, było rozwiązanie zaproponowane przez Anony-Mousse poniżej. Oznacza to, że wykorzystując wszczepienie DBSCAN ELKI do tworzenia moich klastrów, a nie do uczenia się przez skikit. Można go uruchomić z wiersza poleceń i przy odpowiednim indeksowaniu wykonuje to zadanie w ciągu kilku godzin. Użyj GUI i małych przykładowych zestawów danych, aby opracować opcje, których chcesz użyć, a następnie przejdź do miasta. Warto się przyjrzeć. Każdy, kto przeczyta opis mojego oryginalnego problemu i interesującą dyskusję.

Mam zbiór danych zawierający ~ 2,5 miliona próbek, każdy z 35 funkcjami (wartości zmiennoprzecinkowe), które próbuję połączyć w klastry. Próbowałem to zrobić za pomocą implementacji DBSCAN w scikit-learn, używając metryki odległości Manhattan i wartości epsilon oszacowanej na podstawie kilku małych losowych próbek pobranych z danych. Jak na razie dobrze. (tutaj jest fragment kodu, w celach informacyjnych)

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

W tej chwili moim problemem jest to, że łatwo mi zabraknie pamięci. (Obecnie pracuję na komputerze z 16 GB pamięci RAM)

Moje pytanie brzmi, czy DBSCAN oblicza macierz odległości w locie w trakcie jej działania i to właśnie pochłania moją pamięć? (2,5 miliona ^ 2) * 8 bajtów jest oczywiście głupio duże, zrozumiałbym to. Czy nie powinienem używaćfit() metoda? A bardziej ogólnie, czy istnieje jakiś sposób na rozwiązanie tego problemu, czy generalnie szczekam tutaj niewłaściwe drzewo?

Przepraszam, jeśli odpowiedź skończy się oczywista. Zastanawiam się nad tym od kilku dni. Dzięki!

Dodatek: Także jeśli ktoś mógłby wyjaśnić różnicę międzyfit(X) ifit_predict(X) bardziej wyraźnie bym to docenił - obawiam się, że po prostu nie rozumiem.

Dodatek # 2: Aby mieć pewność, po prostu wypróbowałem to na maszynie z ~ 550 GB pamięci RAM i nadal wybuchła, więc czuję, że DBSCAN prawdopodobnie próbuje utworzyć macierz odległości parami lub coś, czego wyraźnie nie chcę do zrobienia. Myślę, że teraz głównym pytaniem jest, jak zatrzymać to zachowanie lub znaleźć inne metody, które mogą bardziej odpowiadać moim potrzebom. Dzięki za przybycie ze mną tutaj.

Dodatek # 3 (!): Zapomniałem dołączyć ślad, oto jest,

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

questionAnswers(5)

yourAnswerToTheQuestion