所以我正在尝试实施凝聚聚类算法并检查每个聚类之间的距离我使用它:
a, b = None, None
c = max
for i in range(len(map)-1):
for n in range(len(map[i])):
for j in range(i+1, len(map)):
for m in range(len(map[j])):
//dist is distance func.
d = dist(map[i][n], map[j][m])
if c > d:
a, b, c = i, j, d
print(a, ' ', b)
return a, b
地图如下所示:{0:[[1,2,3],[2,2,2]],1:[[3,3,3]],2:[[4,4,4] ],[5,5,5]]}
我对此的期望是每个行项与每隔一行的每行/列进行比较。所以像这样:
比较: [1,2,3]和[3,3,3],[1,2,3]和[4,4,4],[1,2,3]和[5,5,5],[2 ,2,2]和[3,3,3]等等
当我运行它时,它只能工作一次,并且在第6行与KeyError之后的任何后续尝试都失败了 我怀疑问题出在这里或合并集群。
答案 0 :(得分:1)
如果map
是值dict
,那么您的索引存在一般问题:
for m in range(len(map[j])):
您使用range()
创建数字索引。但是,此示例中您需要j
是字典map
的有效密钥。
编辑:
那是 - 当然 - 假设您没有使用基于0的递增整数作为map
的关键字,因此您可能会使用list
。通常,您似乎依赖于list
或OrderedDict
(或Python3.6 +中的dict
)中提供的排序作为实现细节。请参阅for j in range(i+1, len(map)):
作为一个很好的例子。因此,我建议使用list
。
编辑2:或者,创建map.keys()
的列表并使用它来索引map
:
a, b = None, None
c = max
keys = list(map.keys())
for i in range(len(map)-1):
for n in range(len(map[keys[i]])):
for j in range(i+1, len(map)):
for m in range(len(map[keys[j]])):
#dist is distance func.
d = dist(map[keys[i]][n], map[keys[j]][m])
if c > d:
a, b, c = i, j, d
print(a, ' ', b)
return a, b
答案 1 :(得分:0)
在访问map [j]之前,检查是否有效:
if j in map.keys():
#whatever
或将其放入try / except:
try:
#...
except KeyError:
#....
编辑: 它更适合用于循环:
for i in map.keys():
#.....