2012-04-24 4 views
13

У меня есть матрица расстояний с около 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) 

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

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

Благодаря

+0

Возможно, я не понимаю, но разве вы не могли сохранить копию до обрезки? –

+0

Я понимаю, что вы имеете в виду. Это может работать, но по-прежнему требуется ручное сопоставление записей, поскольку вывод после обрезки - это dict с количеством членов в каждой ветви, а выход перед обрезкой - это dict с каждой записью, как они появляются в дендрограмме. Затем необходимо сопоставить эти два вместе. – user1354607

+0

Как насчет Z1 ['ivl']. Согласно документации, это «список меток, соответствующих листовым узлам». Вы можете поставить пользовательские метки в качестве входных данных для функции дендрограммы, но по умолчанию они являются только индексами исходного наблюдения. – Dhara

ответ

3

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

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

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