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