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

Я не могу найти достаточно простые уроки или описания по кластеризации в 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 , и как я могу перейти оттуда и обратно к своему документу, в котором я создал матрицу расстояний во-первых, чтобы увидеть, имеет ли кластеры смысл? Я правильно это делаю?

1 Ответ

3 голосов
/ 11 октября 2011

Во-первых, вам не нужно проходить весь процесс с cdist и linkage, если вы используете fclusterdata вместо fcluster; этой функцией вы можете передать (n_documents, n_features) массив терминов, значений tf-idf или любых других функций.

Выходные данные fclusterdata совпадают с выходными данными fcluster: массив T такой, что "T[i] - это номер плоского кластера, которому принадлежит исходное наблюдение i". То есть модуль cluster.hierarchy выравнивает кластеризацию в соответствии с пороговым значением, установленным на 0.5*distances.max(). В вашем случае третий и пятый документы сгруппированы вместе, но все остальные образуют свои собственные кластеры, поэтому вы можете захотеть установить более высокий порог или использовать другой criterion.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...