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. Но сейчас я не могу его найти.