Кластеризация с большим количеством данных - PullRequest
0 голосов
/ 11 октября 2019

Мне нужно объединить около 2 миллионов точек данных, фрейм данных состоит из широт, долгот и другой переменной. Я пробовал k-means с не очень хорошими результатами. Я также пробовал DBSCAN и MeanShift, но с DBSCAN я получил ошибку памяти, а MeanShift занимает около 3 дней. Ребята, вы знаете какой-нибудь метод или технику, чтобы сделать это более эффективным?

Спасибо!

1 Ответ

0 голосов
/ 11 октября 2019

DBSCAN должен занимать линейную память. Это так же хорошо, как и получается.

Возможно, вам просто нужно выбрать лучшую реализацию или параметры.

Документация sklearn, обсуждающая их проблему:

ЭтоРеализация массово вычисляет все запросы соседства, что увеличивает сложность памяти до O (nd), где d - среднее число соседей, в то время как исходный DBSCAN имел сложность памяти O (n). Это может привести к большей сложности памяти при запросе этих ближайших окрестностей, в зависимости от алгоритма.

Один из способов избежать сложности запроса - это предварительное вычисление разреженных окрестностей в порциях с использованием NearestNeighbors.radius_neighbors_graph с mode = 'distance'затем используйте metric = 'precomputed' здесь.

Другой способ уменьшить память и время вычислений - удалить (почти) повторяющиеся точки и использовать вместо этого sample_weight.

Теперь первыйОбходной путь даже неправильно . Если в среднем существует d соседей, материализация radius_neighbors_graph также будет иметь O (nd) записей. Так что это не может быть намного лучше ...

Учебная реализация DBSCAN требует только O (n) памяти. Поэтому для больших наборов данных текущая реализация sklearn не является хорошим выбором. Лучше всего сделать радиус намного меньше!

Хммм ... Я помню пост в блоге, который был несколько лет назад и который объединял около 10 миллионов координат за 10 минут с DBSCAN. Но сейчас я не могу его найти.

...