我有2张地图:map1和map2。 其中字符串是键,值是该键的出现次数。
我想比较地图之间的'delta',即。我想知道一张桌子与另一张桌子有多远,但我不确定计算这种差异的正确函数是什么。
例如:
MAP1: ABBA 100 美国10
MAP2: ABBA 300 美国210
地图1和2中ABBA之间出现的差异是200,以及地图1和2中美国之间出现的差异,但显然不同于10/210 <&lt; 100/300。 所以它无法帮助我对绝对差异做一个平均值。
另一方面,使用除法也不对,因为0/100 == 0/1000。 我知道我需要结合两种方法,但我不知道该怎么做。
答案 0 :(得分:1)
如果您将地图视为向量,则在数学意义上,您可以通过减去匹配元素来计算所有常用距离(度量)。
假设你想要Manhattan (L1) distance。这是两个向量中匹配元素之间绝对差异的总和:
d = 0
for key in map1:
if key in map2:
d += abs(map1[key] - map2[key])
else:
d += abs(map1[key]) # implicit zero in the other map
for key in map2:
if key not in map1:
d += abs(map2[key])
同样,你可以计算Euclidean distance,它是平方差之和的平方根:
d = 0
for key in map1:
for key in map2:
d += (map1[key] - map2[key]) ^ 2
else:
d += map2[key] ^ 2
for key in map2:
if key not in map1:
d += abs(map2[key])
d = sqrt(d)
如果地图查找为O(1),则可以在线性时间内计算这两个,因此可以有许多其他距离。