DBSCAN занимает много времени, чтобы кластеризовать набор данных - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь кластеризовать набор данных, содержащий более 1 миллиона точек данных.Один столбец имеет текст, а другой столбец имеет числовое значение, соответствующее ему.Проблема, с которой я сталкиваюсь, заключается в том, что она застревает и никогда не завершается.Я пытался работать с небольшими наборами данных, насчитывающими около 100 000, и это работает довольно быстро, но когда я начинаю увеличивать количество точек данных, оно начинает замедляться, и за миллион оно никогда не завершается и не зависает.Сначала я подумал, что это может быть из-за того, что у меня есть матрица tfidf для текста и 100 измерений, так что это занимает много времени.Затем я попытался кластеризовать на основе суммы, которая представляет собой всего лишь одно значение для каждой точки данных, и она все еще не завершена.Ниже приведен фрагмент кода.Есть идеи, что я могу делать не так?Я видел людей, работающих с большими наборами данных и не имеющих проблем.

Y=data['amount'].values
Y=Y.reshape(-1,1)
dbscan = DBSCAN(eps=0.3, min_samples= 10, algorithm='kd_tree')
dbscan.fit_predict(Y)
labels = dbscan.labels_
print(labels.size)
clusters = labels.tolist()
#printing the value and its label
for a, b in zip(labels, Y):
    print(a, b)

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Скорее всего, ваш эпсилон слишком велик.

Если большинство точек находится в эпсилоне от большинства других точек, то время выполнения будет квадратичным O (n²).Поэтому начните с малых значений!

Вы не можете просто добавлять / удалять функции и оставлять epsilon без изменений.

0 голосов
/ 30 сентября 2018

Используйте больше ядер.

Используйте параметр n_jobs.Определите его как: n_jobs=-1 внутри DBSCAN класса.

Пример:

Y=data['amount'].values
Y=Y.reshape(-1,1)
dbscan = DBSCAN(eps=0.3, min_samples= 10, algorithm='kd_tree', n_jobs=-1)
dbscan.fit_predict(Y)
labels = dbscan.labels_
print(labels.size)
clusters = labels.tolist()
#printing the value and its label
for a, b in zip(labels, Y):
    print(a, b)
...