Подтвердить что ты не робот

Обрезка дендрограммы в scipy (иерархическая кластеризация)

У меня есть матрица расстояний, насчитывающая около 5000 записей, и использую scipy иерархические методы кластеризации для кластеризации матрицы. Код, который я использую для этого, следующий фрагмент:

Y = fastcluster.linkage(D, method='centroid') # D-distance matrix
Z1 = sch.dendrogram(Y,truncate_mode='level', p=7,show_contracted=True)

Поскольку дендрограмма станет достаточно плотной со всеми этими данными, я использую truncate_mode, чтобы немного ее обрезать. Все это работает, но мне интересно, как я могу узнать, какая из первоначальных 5000 записей принадлежит определенной ветке в дендрограмме.

Я попытался использовать

 leaves = sch.leaves_list(Y)

чтобы получить список листьев, но это использует вывод linkage как indata, и пока я вижу соответствие между обрезанной дендрограммой и списком листьев, становится немного громоздким сопоставление оригинальных записей вручную с дендрограммой.

Подводя итог: есть ли способ перечисления всех исходных записей в матрице расстояний, которая принадлежит ветке в обрезанной дендрограмме? Или есть другие способы сделать это, о которых я не знаю.

Спасибо

4b9b3361

Ответ 1

Одна из словарных структур словаря, возвращаемых scipy.cluster.hierarchy.dendrogram, имеет ключ ivl, который документация описывает как

список меток, соответствующих листовым узлам

Вы можете поставить пользовательские метки (используя labels=<array of lables>) в качестве входа в функцию дендрограммы, но по умолчанию они являются только индексами исходного наблюдения. Сравнивая исходные метки/индексы и Z1['ivl'], вы можете определить, какие были исходные записи.