如何遍历从sklearn AgglomerativeClustering一棵树?

问题描述 投票:5回答:2

我曾在某numpy的文本文件数组:https://github.com/alvations/anythingyouwant/blob/master/WN_food.matrix

它的术语和相互之间的距离矩阵,我的条件的名单是这样: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输出?

是否有可能将其转换成一个树状SciPy的(http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.cluster.hierarchy.dendrogram.html)?而在这之后我怎么遍历树状?

python machine-learning scipy scikit-learn hierarchical-clustering
2个回答
15
投票

我已经回答了sklearn.cluster.ward_tree一个类似的问题:How do you visualize a ward tree from sklearn.cluster.ward_tree?

AgglomerativeClustering输出以同样的方式树,在children_属性。下面是在AgglomerativeClustering病房树问题的代码的适应。它输出的形式(节点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


1
投票

添加到A.P.的答案,这里是代码,这将使你的会员的字典。构件[NODE_ID]给出的所有数据点索引(零到n)。

on_split是A.P的集群,让两个集群时NODE_ID是分割形成的一个简单的格式化。

up_merge告诉什么NODE_ID合并成什么NODE_ID必须结合合并成。

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

import copy
n_points = data_x.shape[0]
members = {i:[i] for i in range(n_points)}
for cluster in clusters:
    node_id = cluster["node_id"]
    members[node_id] = copy.deepcopy(members[cluster["left"]])
    members[node_id].extend(copy.deepcopy(members[cluster["right"]]))

on_split = {c["node_id"]: [c["left"], c["right"]] for c in clusters}
up_merge = {c["left"]: {"into": c["node_id"], "with": c["right"]} for c in clusters}
up_merge.update({c["right"]: {"into": c["node_id"], "with": c["left"]} for c in clusters})
© www.soinside.com 2019 - 2024. All rights reserved.