Кластеризация с помощью scipy - кластеры через матрицу расстояний, как вернуть исходные объекты

Я не могу найти достаточно простых уроков или описаний по кластеризации в 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]

Итак, мой вопрос: что я получаю от функций linkage и 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,

Другие вопросы по тегам