Кластеризация с помощью 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.