У меня возникла путаница в отношении этого модуля (scipy.cluster.hierarchy)... и все еще есть некоторые!
Например, у нас есть следующая дендрограмма:
Мой вопрос: как я могу извлечь цветные поддеревья (каждый из них представляет кластер) в хорошем формате, скажем, в формате SIF? Теперь код для получения сюжета выше:
import scipy
import scipy.cluster.hierarchy as sch
import matplotlib.pylab as plt
scipy.randn(100,2)
d = sch.distance.pdist(X)
Z= sch.linkage(d,method='complete')
P =sch.dendrogram(Z)
plt.savefig('plot_dendrogram.png')
T = sch.fcluster(Z, 0.5*d.max(), 'distance')
#array([4, 5, 3, 2, 2, 3, 5, 2, 2, 5, 2, 2, 2, 3, 2, 3, 2, 5, 4, 5, 2, 5, 2,
# 3, 3, 3, 1, 3, 4, 2, 2, 4, 2, 4, 3, 3, 2, 5, 5, 5, 3, 2, 2, 2, 5, 4,
# 2, 4, 2, 2, 5, 5, 1, 2, 3, 2, 2, 5, 4, 2, 5, 4, 3, 5, 4, 4, 2, 2, 2,
# 4, 2, 5, 2, 2, 3, 3, 2, 4, 5, 3, 4, 4, 2, 1, 5, 4, 2, 2, 5, 5, 2, 2,
# 5, 5, 5, 4, 3, 3, 2, 4], dtype=int32)
sch.leaders(Z,T)
# (array([190, 191, 182, 193, 194], dtype=int32),
# array([2, 3, 1, 4,5],dtype=int32))
Итак, вывод fcluster()
дает кластеризацию узлов (по их идентификаторам), а leaders()
описанный здесь должен возвращать 2 массива:
-
сначала содержит узлы-лидеры кластеров, сгенерированных Z, здесь мы можем видеть, что у нас есть 5 кластеров, а также на графике
-
а второй - идентификатор этих кластеров
Итак, если эти лидеры() вернутся соответственно. L и M: L[2]=182
и M[2]=1
, то кластер 1 обозначается символом node id 182, который не существует в наборе наблюдений X, в документации говорится: "... тогда это соответствует не-синглетону кластер". Но я не могу это получить...
Кроме того, я преобразовал Z в дерево с помощью sch.to_tree(Z)
, который вернет простой в использовании древовидный объект, который я хочу визуализировать, но какой инструмент я должен использовать в качестве графической платформы, которая управляет такими типами древовидные объекты как входы?