“距离”或“相似性”可以指这类问题。
Simply calculating the sum of absolute difference, as you've done, should work fairly well. This is called the Manhattan distance https://en.wikipedia.org/wiki/Taxicab_geometry. In mathematical terms, it would be: ∑x ∈ (a,b,c,d) Abs(x1 - x2)
.
尽管最好的措施实际上取决于您想要什么行为。
Ratio可能是一个更好的主意。
考虑类似的事情1000000, 5, 5, 5
vs 999995, 5, 5, 5
and 1000000, 0, 5, 5
.
根据上面的公式,第一个与第二个和第三个具有相同的相似度。
如果这不是所希望的(如999995
可以认为非常接近1000000
, while 0
可以认为离5
),计算每个距离时应除以两者中的最大值。
∑x ∈ (a,b,c,d) [ Abs(x1 - x2) / max(x1, x2) ]
这会将每个数字置于 0 和 1 之间,即值之间的百分比差异。
这意味着,对于上面的例子,我们会考虑1000000, 5, 5, 5
and 999995, 5, 5, 5
非常相似(因为上面的总和将是|1000000-999995|/1000000 + 0 + 0 + 0 = 0.000005
) and 1000000, 5, 5, 5
and 1000000, 0, 5, 5
将被认为更加不同(因为总和将是|0+5|/5 + 0 + 0 + 0 = 1
).
如果可能为负值,公式需要适当更新。您需要根据您要解决的问题来决定如何处理该问题。应该10 to 0
或多或少不同于(或等同于)5 to -5
?
元素可以在任何程度上互换吗?
考虑类似的事情A=1, B=2, C=3, D=4
and A=4, B=1, C=2, D=3
.
虽然每个单独的元素都发生了变化,但该集合仍然包含1, 2, 3, 4
每个元素简单地移动 1 个位置(除了4
).
对于某些问题,这根本不重要,上面的内容与从A=1, B=11, C=21, D=31
to A=2, B=12, C=22, D=32
。对于其他问题,它可能非常相关。
对于字符串或数组等序列,插入、删除或移动元素的想法可能是有意义的。如果是这样,您会想看看编辑距离 https://en.wikipedia.org/wiki/Edit_distance,其中常见的一个是编辑距离 https://en.wikipedia.org/wiki/Levenshtein_distance。您可能还想考虑修改它以考虑各个值的差异有多大(但这并不是微不足道的)。
对于像一套的东西,元素是可以互换的,但元素上实际上并没有严格的顺序({1, 2, 3}
是相同的{3, 1, 2}
)。如果是这种情况,最简单的方法可能是对值进行排序并仅使用编辑距离。您还可以以某种方式同时循环遍历这两个值,这将使您可以更轻松地考虑值之间的差异。