4

У меня есть Numpy массив текстового файла по адресу: https://github.com/alvations/anythingyouwant/blob/master/WN_food.matrixКак пересечь дерево из sklearn AgglomerativeClustering?

Это матрица расстояний между словами и друг с другом, мой список терминов, как таковые: http://pastebin.com/2xGt7Xjh

Я использовал код последующего для создания иерархического кластера:

import numpy as np 
from sklearn.cluster import AgglomerativeClustering 

matrix = np.loadtxt('WN_food.matrix') 
n_clusters = 518 
model = AgglomerativeClustering(n_clusters=n_clusters, 
           linkage="average", affinity="cosine") 
model.fit(matrix) 

Чтобы получить кластеры для каждого термина, я мог бы сделать:

for term, clusterid in enumerate(model.labels_): 
    print term, clusterid 

Но Как мне пересечь дерево, которое выдает AgglomerativeClustering?

Можно ли превратить его в скудную дендрограмму (http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.cluster.hierarchy.dendrogram.html)? И после этого, как мне пройти дендрограмму?

+0

код [документация] (http://scikit-learn.org/stable/modules/generated/sklearn.cluster.AgglomerativeClustering.html) предложил бы смотреть на 'children_' атрибут 'model'. – jme

+0

Я использовал children_, и он дает мне списки из двух узлов, он не проходит, но возвращает детей, и я понятия не имею, что это такое, и номер узла от детей выходит за пределы моего количества узлов ... – alvas

+1

Полная иерархическая кластеризация Объекты 'n' создают дерево с узлами« 2n - 1 ». Как указано в документации: «Значения, меньшие, чем n_samples, относятся к листьям дерева. Большее значение i указывает узел с дочерними дочерними элементами children_ [i-n_samples]». Это должно быть достаточной информацией для перемещения по дереву. – jme

ответ

13

Я ответил на аналогичный вопрос для sklearn.cluster.ward_tree: How do you visualize a ward tree from sklearn.cluster.ward_tree?

AgglomerativeClustering выводит дерево таким же образом, в children_ атрибута. Вот адаптация кода в вопросе дерева дерева для AgglomerativeClustering. Он выводит структуру дерева в форме (node_id, left_child, right_child) для каждого узла дерева.

import numpy as np 
from sklearn.cluster import AgglomerativeClustering 
import itertools 

X = np.concatenate([np.random.randn(3, 10), np.random.randn(2, 10) + 100]) 
model = AgglomerativeClustering(linkage="average", affinity="cosine") 
model.fit(X) 

ii = itertools.count(X.shape[0]) 
[{'node_id': next(ii), 'left': x[0], 'right':x[1]} for x in model.children_] 

https://stackoverflow.com/a/26152118

+0

есть ли способ узнать, какой элемент находится в узле? – alvas

+0

Как это соотносится с кластерными метками 'model.labels_'? – alvas

+0

Номер узла также является индексом для вектора данных для каждого листа дерева. Например {'left': 1, 'right': 2, 'node_id': 10} узел 10 имеет листья 1 и 2 как дети. X [1] - это вектор данных для листа 1. –