Кластеризация с помощью scipy-кластеров через матрицу расстояний, как вернуть исходные объекты
Я не могу найти достаточно простые учебники или описания кластеризации в scipy, поэтому я попытаюсь объяснить свою проблему:
Я пытаюсь кластеризировать документы (иерархическая агломеративная кластеризация) и создал вектор для каждого документа и создал симметричную матрицу расстояний. Vector_list содержит (действительно длинные) векторы, представляющие каждый документ. Порядок этого списка векторов совпадает с моим списком входных документов, так что я (надеюсь) смогу сопоставьте результаты кластеризации с соответствующим документом.
distances = distance.cdist(vector_list, vector_list, 'euclidean')
это дает такую матрицу, где диагональная линия - это расстояние каждого документа до себя (всегда 0)
[0 5 4]
[5 0 4]
[5 4 0]
Я передаю эту матрицу расстояний в функцию linkage() scipys.
clusters = hier.linkage(distances, method='centroid', metric='euclidean')
это возвращает то, что я не совсем уверен, что такое, но выходит как тип данных numpy.ndarray. Согласно документам, я могу снова ввести это в fcluster, чтобы получить "плоские кластеры". Я использую половину Макс расстояние матрицы, как порог.
idx = hier.fcluster(clu,0.5*distances.max(), 'distance')
Это возвращает numpy.это опять-таки не имеет для меня особого смысла. Пример [6 3 1 7 1 8 9 4 5 2]
Итак, мой вопрос: что я получаю от связь и fcluster функции, и как я могу перейти оттуда и обратно к моему документу, для которого я создал матрицу расстояний, в первую очередь, чтобы увидеть, имеют ли кластеры какой-либо смысл? Я это делаю правильно?
1 ответов
во-первых, вам не нужно проходить весь процесс с cdist
и linkage
Если вы используете fclusterdata
вместо fcluster
; эту функцию вы можете кормить (n_documents, n_features)
массив подсчетов терминов, значений TF-idf или любых ваших функций.
вывод fclusterdata
это то же самое, что fcluster
: массив T
такие, что "T[i]
- это плоский номер кластера, к которому исходное наблюдение i
принадлежит."Т. е., элемент cluster.hierarchy
модуль плющит по кластеризации к порогу, который вы установили в 0.5*distances.max()
. В вашем случае третий и пятый документ сгруппированы вместе, но все остальные образуют собственные кластеры, поэтому вы можете установить порог выше или использовать другой criterion
.