切割最大边缘长度的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
您的代码似乎畸形(_super_intersection的最后两行misindented)。 – 2010-07-10 15:04:18
我必须说我不明白你在这里要做什么。 – 2010-07-10 15:09:38
我的代码试图对仍然通过不间断MST边缘连接的节点进行分组。如果您要绘制MST,您可以直观地看到什么是组,但现在我试图通过算法来实现。代码基本上是循环遍历2D数组。每一行都是节点编号描述的“边缘”。然后代码循环遍历每行,并在满足交集时在行之间创建更大的集合。一旦完成,它会将两行的元素合并为一个集合。采取该设置,并继续通过阵列的其余部分。 – ebressert 2010-07-11 21:42:44