У меня есть матрица расстояний с около 5000 записей и использую иерархические методы кластеризации Scipy для кластеризации матрицы. Код я использую для этого следующий фрагмент кода:Обрезка дендрограммы в 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)
, чтобы получить список листьев, но это использует выход тяг как входные данные, и в то время как я могу видеть соответствие между обрезанной дендрограммой и листами-листом, он становится бит громоздкий, чтобы вручную отображать оригинальные записи в дендрограмму.
Подводя итог: есть ли способ перечисления всех исходных записей в матрице расстояний, которая принадлежит ветке в обрезанной дендрограмме? Или есть другие способы сделать это, о которых я не знаю.
Благодаря
Возможно, я не понимаю, но разве вы не могли сохранить копию до обрезки? –
Я понимаю, что вы имеете в виду. Это может работать, но по-прежнему требуется ручное сопоставление записей, поскольку вывод после обрезки - это dict с количеством членов в каждой ветви, а выход перед обрезкой - это dict с каждой записью, как они появляются в дендрограмме. Затем необходимо сопоставить эти два вместе. – user1354607
Как насчет Z1 ['ivl']. Согласно документации, это «список меток, соответствующих листовым узлам». Вы можете поставить пользовательские метки в качестве входных данных для функции дендрограммы, но по умолчанию они являются только индексами исходного наблюдения. – Dhara