Я не могу найти достаточно простые уроки или описания по кластеризации в scipy, поэтому я попытаюсь объяснить мою проблему:
Я пытаюсь кластеризовать документы (иерархическая агломерационная кластеризация), и создал вектор для каждого документа и создал симметричную матрицу расстояний. В vector_list содержатся (действительно длинные) векторы, представляющие каждый документ. Порядок этого списка векторов совпадает с моим списком входных документов, поэтому (надеюсь) я смогу сопоставить результаты кластеризации с соответствующим документом.
distances = distance.cdist(vector_list, vector_list, 'euclidean')
Это дает такую матрицу, где диагональная линия - это расстояние до каждого документа (всегда 0)
[0 5 4]
[5 0 4]
[5 4 0]
Я передаю эту матрицу расстояний функции scipys 'linkage ().
clusters = hier.linkage(distances, method='centroid', metric='euclidean')
это возвращает что-то, я не совсем уверен, что это, но выходит как тип данных numpy.ndarray. В соответствии с документами я могу снова передать это в fcluster, чтобы получить «плоские кластеры». Я использую половину максимального расстояния в матрице расстояний в качестве порога.
idx = hier.fcluster(clu,0.5*distances.max(), 'distance')
Это возвращает numpy.ndarray, который снова не имеет большого смысла для меня. Примером является [6 3 1 7 1 8 9 4 5 2]
Итак, мой вопрос: что я получаю от функций linking и fcluster , и как я могу перейти оттуда и обратно к своему документу, в котором я создал матрицу расстояний во-первых, чтобы увидеть, имеет ли кластеры смысл? Я правильно это делаю?