ОБНОВЛЕНО:. В конце концов, решение, которое я выбрал для кластеризации моего большого набора данных, было предложено Anony-Mousse ниже. То есть, используя ELKI DBSCAN implimentation для моей кластеризации, а не для scikit-learn. Его можно запустить из командной строки и с правильной индексацией, выполняет эту задачу в течение нескольких часов. Используйте графические интерфейсы и небольшие образцы данных для разработки вариантов, которые вы хотите использовать, а затем перейдите в город. Стоит посмотреть. Anywho, читайте дальше для описания моей оригинальной проблемы и некоторого интересного обсуждения.
У меня есть набор данных с ~ 2,5 миллионами выборок, каждый из которых имеет 35 функций (значения с плавающей запятой), которые я пытаюсь сгруппировать. Я пытался это сделать с помощью scikit-learn реализации DBSCAN, используя метрику расстояния Манхэттена и значение epsilon, оцененное по некоторым небольшим случайным образцам, взятым из данных. Все идет нормально. (здесь приведен фрагмент, для справки)
db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)
Моя проблема на данный момент заключается в том, что я легко исчерпал память. (Сейчас я работаю на машине с 16 ГБ ОЗУ)
Мой вопрос в том, что DBSCAN рассчитывает парную матрицу расстояний "на лету", когда она работает, и что то, что поглощает мою память? (2,5 миллиона ^ 2) * 8 байтов, очевидно, глупо большое, я бы это понял. Должен ли я использовать метод fit()
? И, в общем, есть ли способ обойти эту проблему, или я вообще лаяю здесь неправильное дерево?
Извиняется, если ответ обернется очевидным. Я несколько раз задумывался над этим. Спасибо!
Добавление: Также, если бы кто-нибудь мог объяснить разницу между fit(X)
и fit_predict(X)
более явным образом, я также был бы признателен за это - я боюсь, что я просто не совсем понял.
Добавление # 2: Конечно, я просто попробовал это на машине с ~ 550 ГБ ОЗУ и все еще взорвался, поэтому я чувствую, что DBSCAN, вероятно, пытается сделать парную матрицу расстояний или что-то, что я, я хочу это сделать. Думаю, теперь большой вопрос - как остановить это поведение или найти другие методы, которые могли бы удовлетворить мои потребности больше. Спасибо за то, что вы здесь.
Приложение № 3 (!): я забыл приложить трассировку, вот она,
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