Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于阈值的聚类_Python_Tree_Hierarchy - Fatal编程技术网

Python 基于阈值的聚类

Python 基于阈值的聚类,python,tree,hierarchy,Python,Tree,Hierarchy,编辑(简化) 我很确定,我遗漏了“谷歌”这个问题的正确术语,如果以前有人问过,请一定要告诉我: 我有一个树形结构,假设如下 (0)->(0,0:7) (0,1:9) (1)->(1,0:6) (1,1:2) (1,2:1) 为了简单起见,让我们将其转换为平面结构 l1, l2, v1 0, 0, 7 0, 1, 9 1, 0, 6 1, 1, 2 1, 2, 1 现在,让我们在此树上设置一个3阈值。这意味着我们希望保留高于阈值的节点,并合并分支中低于

编辑(简化)

我很确定,我遗漏了“谷歌”这个问题的正确术语,如果以前有人问过,请一定要告诉我: 我有一个树形结构,假设如下

(0)->(0,0:7)
     (0,1:9)
(1)->(1,0:6)
     (1,1:2)
     (1,2:1)
为了简单起见,让我们将其转换为平面结构

l1, l2, v1
0, 0, 7
0, 1, 9
1, 0, 6
1, 1, 2
1, 2, 1
现在,让我们在此树上设置一个
3
阈值。这意味着我们希望保留高于阈值的节点,并合并分支中低于阈值的所有节点

因此,我们最终得到的结果是,最后两行(因为它们低于阈值)以一张票据作为两行的总和“产生”:

l1, l2, v1
0, 0, 7
0, 1, 9
1, 0, 6
1, (1,2),  3

理想情况下,最好使用python解决方案。显然,我很乐意处理一些边缘条件。请注意,在现实中,我最终会得到一棵6深的树。

因此,我最终以我先前暗示的笨拙方式完成了这项工作。 我首先在节点定义中添加了几个标志(
dodelite=False
visted=False

并将
add_节点
方法更新为

def add_child(self, node):
    node.parent = self
    node.level = self.level + 1
    self.children.append(node)
    return node
其中
self.children
是节点列表

然后是两种方法

def collapse_nodes(tree, thresh=3):
    for n in tree:
        if n.dodelete:
            continue
        sub_tree = tree.get_by_path (n.id)
        sub_tree_stack = []
        for child in sub_tree.children:
           if child.val is not None and thresh > child.val:
               sub_tree_stack.append(child)
               tree.get_by_path(child.id).dodelete = True
           if sub_tree_stack:
              sub_tree.add_child(Node(",".join([subnode.name for subnode in sub_tree_stack]), 
                                 val = sum([subnode.val for subnode in sub_tree_stack]), 
                                 id= sorted([subnode.id for subnode in sub_tree_stack])[0]))
    return tree

def上卷(树,阈值=2,级别=5):
对于树中的n:
如果n.多德莱特或n.访问:
持续
如果n.level!=级别:
持续
sub_tree=树。通过路径获取(n.id)
如果子树为无:
持续
子_树_堆栈=[]
用于树中的子项。通过路径(n.id)获取子项。子项:

如果child.val不是None,则child.val欢迎使用StackOverflow。请阅读并遵循帮助文档进行发布,尤其是。我们不是一个编码服务。也就是说,也许你需要的是某些软件包中的“groupby”功能。此外,我们需要更多的细节来正确地指导您。前两列是否需要匹配才能支持集群?如果没有,我们如何处理这些?例如,如果我们的阈值为5和8.5,我们是否将两条中间线合并?如果是的话,怎么做?感谢导游。。我同意这不是一个编码服务:P。我更多地是从scipy层次聚类的派生角度来考虑的。因此,为了回答你的问题,1)是的,我们需要一些级别来匹配,2)如果阈值更高,比如说7,那么我们将合并整个(1,0,:)分支,使其1,0,(0,1,2)为9。我脑海中有一个soloution,涉及深度优先遍历,侧面有一个堆栈,你从叶子开始,如果叶子高于阈值,如果同级低于阈值,则将该特定节点推送到堆栈中,一旦在分支中遍历所有子节点,即到达根节点(在我的示例l1中)或满足阈值,则清空堆栈并移动到下一个分支。感觉像是过度杀戮,但如果是这样的话,这就是我无法判断是否过度杀戮的原因。我将等待完整的问题出现。谢谢
def roll_up(tree, thresh = 2, level=5):
    for n in tree:
        if n.dodelete or n.visited:
            continue
        if n.level != level:
            continue
        sub_tree = tree.get_by_path(n.id)
        if sub_tree is None:
            continue
        sub_tree_stack = []
        for child in tree.get_by_path(n.id).children:
            if child.val is not None and child.val <= thresh:
                sub_tree_stack.append((child.name, child.id, child.val))
                # Also mark this for deletion
                tree.get_by_path(child.id).dodelete = True
        if sub_tree_stack:
            # Get the parent for these nodes
            node_name = n.name + ": [" + ",".join([subnode[0] for subnode in sub_tree_stack]) + "]"
            node_val = sum([subnode[2]for subnode in sub_tree_stack])
            node_id = sorted([subnode[1] for subnode in sub_tree_stack])[0]
            parent_name = n.parent.name
            parent_level = n.parent.level
            parent_id= n.parent.id
            # Now ensure that you delete the old node before adding new
            tree.get_by_path(n.id).dodelete = True

            tree.get_by_path(parent_id).add_child(Node(node_name, val=node_val, id = n.id, visited=True) )
    return tree