Ho avuto una confusione riguardo a questo modulo (scipy.cluster.hierarchy) ... e ne ho ancora un po '!come faccio a ottenere le sottostrutture del dendrogramma fatte da scipy.cluster.hierarchy
Per esempio abbiamo la seguente dendrogramma:
mia domanda è come posso estrarre le sottostrutture colorate (ognuno rappresenta un cluster) in un bel formato, diciamo formato SIF? Ora il codice per ottenere la trama sopra è:
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))
Così ora, l'uscita del fcluster()
dà il raggruppamento dei nodi (dal loro id), e leaders()
descritto here deve restituire 2 array:
primo contiene i nodi leader del cluster generati da Z, qui possiamo vedere che abbiamo 5 grappoli, così come nella trama
e la seconda i id di questi gruppi
Quindi se questo leader() restituisce resp. L e M: L[2]=182
e M[2]=1
, quindi il cluster 1 è guidato dal nodo id 182, che non esiste nel set di osservazioni X, la documentazione dice "... quindi corrisponde a un cluster non singleton". Ma non riesco a ottenerlo ...
Inoltre, ho convertito la Z in un albero di sch.to_tree(Z)
, che restituirà un oggetto ad albero facile da usare, che voglio visualizzare, ma quale strumento dovrei usare come piattaforma grafica che manipola questo tipo di oggetti dell'albero come input?
Questo risp mi ha aiutato ad arrivare dove avrei potuto tracciare sottoalberi del dendrogramma con osservazioni trovate all'interno di una data distanza fenetica (PD). Non ho trovato i metodi fcluster o fclusterdata utili per questo. Ho usato sch.to_tree (linkage) .pre_order(), quindi ho testato in sequenza gli elementi adiacenti in quell'elenco per essere all'interno del PD in riferimento alla matrice distanza pdist (vedi http://stackoverflow.com/a/17870926/1876324), poi ricalcolato distanza, linkage e dendrogramma per ogni gruppo che volevo tracciare. Un PD di 4, ad esempio, raggrupperebbe i dati OP nei 3 sottoalberi desiderati. –