DBSCAN: кластеризация большого набора строк в Python - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь сгруппировать столбец, содержащий 40 000 строк строковых данных, в x количество кластеров на основе сходства строк. Я нашел DBSCAN подходящий алгоритм, так как я не знаю предполагаемого количества кластеров или слов для сравнения. Левенштейн наиболее подходит в качестве метрики расстояния для кластеризации на основе сходства строк. Код ниже.

Я получаю ошибку памяти при запуске алгоритма: моя оперативная память взрывается. Масштабируемость, кажется, проблема с dbscan. Запуск dbscan для 10 строк уже проблематичен для моего ноутбука, для этого расчета требуется 7 + 8 ГБ ОЗУ. Некоторые предлагают индекс Ball_Tree в качестве решения; в приведенном ниже коде вы можете увидеть, что я пытался, но та же проблема с памятью.

Я видел похожие проблемы в разных сообщениях . Я могу найти вариант для dbscan, который является NG-DBSCAN и dbscan-multiplex , но я не могу найти способ реализовать эти методы. Другим предлагаемым решением является использование ELKI в Java, но я надеюсь прийти к решению с использованием Python.

Мне нужна помощь в поиске обходного пути для проблемы с памятью, чтобы я мог запустить алгоритм dbscan и кластеризовать строки 40 КБ в моем файле данных.

Это код, который я написал:

df4 = df1[['Omschrijving2']].copy()
data = df4.values

def lev_metric(x, y):
    i, j = int(x[0]), int(y[0])     # extract indices
    return pylev.levenshtein(data[i], data[j])

X = np.arange(len(data)).reshape(-1, 1)

dbscan(X, eps=2, min_samples=50, metric=lev_metric, metric_params=None, 
algorithm="auto", leaf_size=100, sample_weight=None, n_jobs=1)

или BallTree dbscan:

eps=2
tree = BallTree(X, leaf_size=30, metric=lev_metric)
tree.query_radius(X, r=eps)
...