最近在做分层聚类,聚类结果可以通过scipy的分层聚类包得到。分层聚类的思想就是不断融合两个“距离最近”的簇,直到不满足用户划定的融合阈值为止。这样,最终将得到一棵二叉树。每个叶子结点对应到原始数据集中的每个观测点。每个簇中的簇我是知道的,但是内部的组织关系不知道。我要做的就是对每个簇的二叉子树的组织结构进行描述。聚类的结果为各个簇的元素,而且各个簇的父节点也可以得到。我现在要把每个簇的聚类过程描述出来。现在得到了很多这样的嵌套列表:
l = [1, [3, [5, [9, 10]]]]
现在,要得到自内向外的合并顺序。
这个例子中,我要得到的最终结果为:
l = [[9, 10], [5, 9, 10], [3, 5, 9, 10], [1, 3, 5, 9, 10]]
对应到分层聚类问题就是:
[9,10]聚成一类,然后再和5聚成一类,再和3聚成一类,最后和1聚成一类。
这样一来,簇内的各个节点的层次关系就显而易见了。可以将其输出成文本形式,能够作为相似性强弱的参考依据。
这里附上例子的源代码:
from collections import Iterable a = [] def flatten(items, ignore_types=(str, bytes)): for x in items: if isinstance(x, Iterable) and not isinstance(x, ignore_types): b = [] for item in flatten(x): yield item b.append(item) a.append(b) else: yield x items = [1, [3, [5, [9, 10]]]] c = [] for x in flatten(items): c.append(x) a.append(c) print a借鉴了python cookbook中的扁平化处理嵌套型序列的方法。
这只是项目中碰到的若干小问题中的一个,不过它在簇内层次关系的抽取上起到了不小的作用。