Преобразование ndarray, сгенерированного hcluster, в строку Newick для использования с пакетом ete2
У меня есть список векторов, созданных с помощью:
import hcluster
import numpy as np
from ete2 import Tree
vecs = [np.array(i) for i in document_list]
где document_list - это набор веб-документов, которые я анализирую. Затем я выполняю иерархическую кластеризацию:
Z = hcluster.linkage(vecs, metric='cosine')
Это создает ndarray, такой как:
[[ 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. ]]
Можно ли преобразовать этот ndarray в строку newick, которую можно передать конструктору ete2 Tree(), чтобы я мог рисовать и манипулировать деревом newick с помощью инструментов, предоставляемых ete2?
Имеет ли смысл даже попытаться сделать это, и если нет, то есть ли другой способ, которым я могу сгенерировать дерево / дендрограмму, используя те же данные и ete2 (я понимаю, что есть другие пакеты, которые могут рисовать дендрограммы, такие как дендропия и сам hcluster, но предпочли бы использовать ete2 все же)?
Спасибо!
2 ответа
Я использую следующий подход для почти одного и того же:
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
Обновить:
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)