def agglomerate(labels, grid):
clusters = labels
while len(clusters) >1000:#need to have a stopping rule here i did manually
# find 2 closest clusters
#print clusters
distances = []
for i,row in enumerate(grid[:5]):
distances += [(i, i+j+1, c) for j,c in enumerate(row[i+1:])]
i,j,_ = max(distances, key=lambda x:x[2])
clusters[i]=[clusters[i],clusters[j]]
clusters.pop(j)
grid = add(grid, i, j)
return clusters
这是聚类数据集的代码
def add(grid, lefti, righti):
for r in grid:
r[lefti] = max(r[lefti], r.pop(righti))
grid[lefti] = map(max, zip(grid[lefti], grid.pop(righti)))
return grid
现在在这里我将集群作为列表列表,并希望访问每个集群中的所有点以汇总数据 那个
def getPoints(a,l):
c = a[:]
if (isinstance(c, list)and len(l)!=1):
getPoints(c[0],l)
getPoints(c[1],l)
else:
l.append(c)
return l
getting recursion error as i call getPoints(a,l)
----> 5 getPoints(c[0],l)
6 getPoints(c[1],l)
7 else:
RuntimeError: maximum recursion depth exceeded
since the dataset consist of 10^15 datapoints
答案 0 :(得分:0)
首先,请使用有意义的变量名称;您的单字母标识符使代码更难理解。
我认为您对列表管理感到困惑。您将 l 的值传递给例程并对其进行更改,然后将其作为返回值发回...然后忽略该返回值。
递归深度的第一个嫌疑人是你日常工作中的无限递归;逻辑跟踪的输出在哪里?对于任何此类问题,您的首要任务之一是确定调用问题的调用序列:使用调试器跟踪它。执行此操作的一种低技术方法是将跟踪打印语句放入所有例程,跟踪条目,退出和传递的值。
请注意,您有10 ^ 15个数据点;你似乎试图将它们全部放入一个列表中。你有足够的内存吗?由于您没有包含整个错误消息,因此无法确定代码堆栈中可能出现的错误。
您尚未描述您的数据结构;如果它是一个相对平衡的二叉树(如代码所示),那么你的树深度至少为51,可能会多一点,具体取决于平衡。第二个嫌疑人是树不平衡,并且一个分支比默认递归限制更深。逻辑跟踪将捕捉到这一点。