Python 在sklearn'中提取从根到叶的路径;s凝聚聚类

Python 在sklearn'中提取从根到叶的路径;s凝聚聚类,python,scikit-learn,hierarchical-clustering,Python,Scikit Learn,Hierarchical Clustering,给定由sklearn.aggregativeclustering创建的聚合集群的某些特定叶节点,我试图确定从根节点(所有数据点)到给定叶节点的路径,以及每个中间步骤(树的内部节点)对应数据点的列表,请参见下面的示例 在这个例子中,我考虑了五个数据点,并将重点放在点3上,这样我想提取从根开始并在叶3结束的每一步中所考虑的实例,因此期望的结果是[[1,2,3,4],[1,3,4],[3,4],[3 ] ]。如何使用sklearn实现这一点(或者如果使用其他库无法实现这一点)?下面的代码首先查找焦点

给定由
sklearn.aggregativeclustering
创建的聚合集群的某些特定叶节点,我试图确定从根节点(所有数据点)到给定叶节点的路径,以及每个中间步骤(树的内部节点)对应数据点的列表,请参见下面的示例


在这个例子中,我考虑了五个数据点,并将重点放在点3上,这样我想提取从根开始并在叶3结束的每一步中所考虑的实例,因此期望的结果是[[1,2,3,4],[1,3,4],[3,4],[3 ] ]。如何使用sklearn实现这一点(或者如果使用其他库无法实现这一点)?

下面的代码首先查找焦点的所有祖先(使用下面的查找祖先函数),然后查找并添加每个祖先的所有后代(查找祖先

首次加载和训练数据:

iris = load_iris()
N = 10
x = iris.data[:N]
model = AgglomerativeClustering(compute_full_tree=True).fit(x)
以下是主要代码:

ans = []
for a in find_ancestor(3)[::-1]:
    ans.append(find_descendent(a))
print(ans)
在我的案例中,哪些输出:

[[1, 9, 8, 6, 2, 3, 5, 7, 0, 4],
 [1, 9, 8, 6, 2, 3],
 [8, 6, 2, 3],
 [6, 2, 3],
 [2, 3],
 [3]]
要理解
查找祖先的代码
,请记住索引为
i
的非叶节点的两个子节点位于
模型。子节点[i]

def find_ancestor(target):
    for ind,pair in enumerate(model.children_):
        if target in pair:
            return [target]+find_ancestor(N+ind)
    return [ind+N]
递归的
find_后代
使用
mem
将其输出保存在内存中,这样它们就不会得到不必要的重新计算

mem = {}
def find_descendent(node):
    global mem
    if node in mem: return mem[node]
    if node<N: return [node]
    pair = model.children_[node-N]
    mem[node] = find_descendent(pair[0])+find_descendent(pair[1])
    return mem[node]
mem={}
def查找_子代(节点):
全球成员
if mem中的节点:返回mem[node]
if节点