ZAKTUALIZOWANE: Ostatecznie, rozwiązanie, które wybrałem do grupowania mojego dużego zbioru danych, zostało zaproponowane przez Anony-Mousse poniżej. Oznacza to, że za pomocą implementacji ELK w DBSCAN można tworzyć klastrowanie zamiast uczenia się przez scikit. 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 udaj się do miasta. Warto się przyjrzeć. Anywho, przeczytaj opis mojego pierwotnego problemu i interesującą dyskusję.Wykorzystanie pamięci scikit-learning DBSCAN
Mam zestaw danych zawierający ~ 2,5 miliona próbek, każdy z 35 funkcjami (wartości zmiennoprzecinkowe), które próbuję utworzyć klaster. Próbowałem to zrobić dzięki implementacji DBSCAN scikit-learning przy użyciu metryki odległości Manhattan i wartości epsilon oszacowanej na podstawie niewielkich losowych próbek pobranych z danych. Jak na razie dobrze. (tutaj jest fragment, dla odniesienia)
db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)
Moim problemem w tej chwili jest to, że łatwo mi zabraknie pamięci. (Obecnie pracuję na maszynie z 16 GB pamięci RAM)
Moje pytanie brzmi, czy DBSCAN oblicza macierz odległości parami w locie w trakcie działania, i to jest to, co pożera moją pamięć? (2,5 miliona^2) * 8 bajtów jest oczywiście głupio duże, rozumiem to. Czy nie powinienem używać metody fit()
? A ogólniej, czy istnieje sposób obejścia tego problemu, czy generalnie szczerzę tu niewłaściwe drzewo?
Przepraszam, jeśli odpowiedź staje się oczywista. Zastanawiałem się nad tym przez kilka dni. Dzięki!
Dodatek: Nawet jeśli ktoś mógłby wyjaśnić mi różnicę między fit(X)
i fit_predict(X)
, doceniłbym to - obawiam się, że po prostu nie rozumiem tego.
Dodatek # 2: Na pewno, po prostu wypróbowałem to na maszynie z ~ 550 GB pamięci RAM i nadal wybuchło, więc czuję, że DBSCAN prawdopodobnie próbuje utworzyć macierz odległości parami lub coś, co wyraźnie zaznaczam nie chcę tego robić. Chyba teraz najważniejsze pytanie brzmi: jak zatrzymać to zachowanie lub znaleźć inne metody, które mogą bardziej odpowiadać moim potrzebom. Dziękuję, że przyjechałeś tu ze mną.
Załącznik nr 3 (!): Zapomniałem dołączyć traceback, to jest tutaj,
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
W rzeczywistości wydaje się, że nie byłoby zbyt trudno poprawić implementację sklearn. Mamy strukturę danych z drzewkami kulkowymi, która dokładnie obsługuje zapytanie o promień. Nie jestem obeznany z dbscan, więc nie wiedziałem, że potrzebuje tylko tych zapytań. Powinniśmy zdecydowanie poprawić tam. –
Tak, nie powinno być zbyt trudno to naprawić w sklearn. –
Lepsza implementacja sklearn DBSCAN byłaby świetna. –