2012-02-20 15 views
5

tengo una lista de vectores creados mediante la ejecución:Conversión ndarray generados por hcluster en una cadena Newick para su uso con ete2 paquete

import hcluster 
import numpy as np 
from ete2 import Tree 

vecs = [np.array(i) for i in document_list] 

donde document_list es una colección de documentos web que estoy analizando. a continuación, realizo agrupación jerárquica:

Z = hcluster.linkage(vecs, metric='cosine') 

Esto genera un ndarray tales como:

[[ 12.   19.   0.   1.  ] 
[ 15.   21.   0.   3.  ] 
[ 18.   22.   0.   4.  ] 
[ 3.   16.   0.   7.  ] 
[ 8.   23.   0.   6.  ] 
[ 5.   27.   0.   6.  ] 
[ 1.   28.   0.   7.  ] 
[ 0.   21.   0.   2.  ] 
[ 5.   29.   0.18350472 2.  ] 
[ 2.   10.   0.18350472 3.  ] 
[ 47.   30.   0.29289577 9.  ] 
[ 13.   28.   0.29289577 13.  ] 
[ 73.   32.   0.29289577 18.  ] 
[ 26.   12.   0.42264521 5.  ] 
[ 5.   33.   0.42264521 12.  ] 
[ 14.   35.   0.42264521 12.  ] 
[ 19.   35.   0.42264521 18.  ] 
[ 4.   20.   0.31174826 3.  ] 
[ 34.   21.   0.5   19.  ] 
[ 38.   29.   0.31174826 21.  ]] 

¿Es posible convertir este ndarray en una cadena newick que se puede pasar al Árbol ete2() constructor de modo que puedo dibujar y manipular un árbol nuevo utilizando las herramientas provistas por ete2?

Tiene sentido intentarlo y si no hay otra forma de generar un árbol/dendrograma con los mismos datos y ete2 (me doy cuenta de que hay otros paquetes que pueden dibujar dendrogramas como la dendropía y hcluster en sí, pero preferiría usar ete2 de todos modos)?

Gracias!

Respuesta

3

uso el siguiente enfoque para más o menos la misma cosa:

from hcluster import linkage, to_tree 
from ete2 import Tree 

#hcluster part 
Y = dist_matrix(items, dist_fn) 
Z = linkage(Y, "single") 
T = to_tree(Z) 

#ete2 section 
root = Tree() 
root.dist = 0 
root.name = "root" 
item2node = {T: root} 

to_visit = [T] 
while to_visit: 
    node = to_visit.pop() 
    cl_dist = node.dist /2.0 
    for ch_node in [node.left, node.right]: 
     if ch_node: 
      ch = Tree() 
      ch.dist = cl_dist 
      ch.name = str(ch_node.id) 
      item2node[node].add_child(ch) 
      item2node[ch_node] = ch 
      to_visit.append(ch_node) 

# This is your ETE tree structure 
tree = root 
+1

Lamentablemente, tenga en cuenta que dist_matrix es mi propia función para generar la matriz de distancia. Reemplácelo por sus propios valores (es decir, vecs) – jhc

0

Actualización:

from hcluster import linkage, to_tree 
from ete2 import Tree 

#hcluster part 
Y = dist_matrix(items, dist_fn) 
Z = linkage(Y, "single") 

R,T  = to_tree(mat, rd=True) 
#print "ROOT", R, "TREE", T 
root  = Tree() 
root.dist = 0 
root.name = 'root' 
item2node = {R.get_id(): root} 
to_visit = T 

while to_visit: 
    node = to_visit.pop() 
    #print "NODE", node 
    cl_dist = node.dist/2.0 

    for ch_node in [node.get_left(), node.get_right()]: 
     if ch_node: 
      ch_node_id   = ch_node.get_id() 
      ch_node_name  = str(ch_node_id) 
      ch     = Tree() 
      ch.dist   = cl_dist 
      ch.name   = ch_node_name 

      if nodeNames: 
       if ch_node_id < len(nodeNames): 
        ch.name = nodeNames[ ch_node_id ] 

      item2node[ch_node_id] = ch 
      item2node[ch_node_id].add_child(ch) 
      to_visit.append(ch_node) 
+3

¡Bienvenido a Stack Overflow! Si bien este fragmento de código es bienvenido, y puede proporcionar algo de ayuda, sería [mucho mejor si incluyera una explicación] (// meta.stackexchange.com/q/114762) de * cómo * y * por qué * esto resuelve el problema . Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, ¡no solo a la persona que pregunta ahora! Por favor [edite] su respuesta para agregar una explicación y dar una indicación de qué limitaciones y suposiciones se aplican. –

Cuestiones relacionadas