2010-07-05 84 views
1

切割最大边缘长度的MST后聚类节点的最佳方式是什么?我从MST边缘切割的输出是一个2xN数组,其中每个元素是一个整数。整数是描述边缘的节点标识符。输出的例子如下:最小生成树切割后的聚类

>>> print array[0:3] 
[[ 0 1] 
[ 0 2] 
[ 2 17]] 

我通常处理100到20,000个节点。我的MST代码足够快,但是它正在被聚类/分组算法陷入困境。这是一个循环繁重的功能集,这就是放慢速度的原因。看看下面的代码。任何想法如何加快它?我知道这是一种暴力方法,所以一个更清洁的方法将是最好的。在此先感谢您的帮助!

干杯,

def _super_intersection(edges): 
    group = set(edges[0]) 
    index = np.array([0]) 
    k = 0 
    while k < 100: 
     k += 1 
     i = 0 
     for edge in edges[1:]: 
      i += 1 
      edge = set(edge) 
      if group & edge: 
       group = group | edge 
       index = np.append(index, i) 

index = np.unique(np.array(index)) 
return group, index 


def cluster(self, gmin = 5): 
    # A 2xN array of node IDs 
    edges = self.edges 
    group_nodes = {} 
    for no, edge in enumerate(edges): 
     try: 
      group, indice = _super_intersection(edges) 
      id_no = no     
      edges = np.delete(edges,indice,0) 
      if len(group) >= gmin: 
       group_nodes[id_no] = list(group) 
     except: 
      self.group_nodes = group_nodes 
+0

您的代码似乎畸形(_super_intersection的最后两行misindented)。 – 2010-07-10 15:04:18

+0

我必须说我不明白你在这里要做什么。 – 2010-07-10 15:09:38

+0

我的代码试图对仍然通过不间断MST边缘连接的节点进行分组。如果您要绘制MST,您可以直观地看到什么是组,但现在我试图通过算法来实现。代码基本上是循环遍历2D数组。每一行都是节点编号描述的“边缘”。然后代码循环遍历每行,并在满足交集时在行之间创建更大的集合。一旦完成,它会将两行的元素合并为一个集合。采取该设置,并继续通过阵列的其余部分。 – ebressert 2010-07-11 21:42:44

回答