7

假设我有一个如下所示的数据集:

{A:1, B:3, C:6, D:6}

我还有一个其他集合的列表来比较我的特定集合:

{A:1, B:3, C:6, D:6},  
{A:2, B:3, C:6, D:6},  
{A:99, B:3, C:6, D:6},  
{A:5, B:1, C:6, D:9},  
{A:4, B:2, C:2, D:6}

我的条目可以可视化为一个表格(有四列,A、B、C、D 和 E)。

如何找到最相似的集合?对于此示例,第 1 行是完美匹配,第 2 行是紧随其后的,而第 3 行则相距甚远。

例如,我正在考虑计算一个简单的增量:Abs(a1 - a2) + Abs(b1 - b2) + etc并且可能获得具有最佳增量的条目的相关值。

这是一种有效的方式吗?这个问题的名称是什么?

4

2 回答 2

3

“距离”或“相似度”可以指这种类型的问题。

正如您所做的那样,简单地计算绝对差的总和应该可以很好地工作。这称为曼哈顿距离。用数学术语来说,它是:.∑<sub>x ∈ (a,b,c,d) Abs(x1 - x2)

尽管最好的衡量标准实际上取决于您想要的行为。

比率可能是一个更好的主意。

考虑类似1000000, 5, 5, 5vs999995, 5, 5, 51000000, 0, 5, 5.

根据上面的公式,第一个与第二个和第三个具有相同的相似性。

如果不希望这样做(999995可以认为非常接近1000000,而0可以认为离 很远5),则在计算每个距离时应除以两者中的最大值。

∑<sub>x ∈ (a,b,c,d) [ Abs(x1 - x2) / max(x1, x2) ]

这会将每个数字置于 0 和 1 之间,这是值之间的百分比差异。

这意味着,对于我们上面的例子,我们会认为1000000, 5, 5, 5999995, 5, 5, 5非常相似(因为上面的总和是|1000000-999995|/1000000 + 0 + 0 + 0 = 0.000005),并且1000000, 5, 5, 51000000, 0, 5, 5将被认为更加不同(因为总和是|0+5|/5 + 0 + 0 + 0 = 1)。

如果可能出现负值,则需要适当更新公式。您需要根据您要解决的问题来决定如何处理它。应该10 to 0或多或少不同于(或等同于)5 to -5

元素是否可以在任何程度上互换?

考虑类似A=1, B=2, C=3, D=4A=4, B=1, C=2, D=3

虽然每个单独的元素都发生了变化,但集合仍然由每个元素组成,1, 2, 3, 4并且每个元素仅移动 1 个位置(除了4)。

对于某些问题,这根本不重要,上面的内容与 from A=1, B=11, C=21, D=31to没有什么不同A=2, B=12, C=22, D=32。对于其他问题,它可能非常相关。

对于像 string 或 array 这样的序列,插入、删除或移动元素的想法可能是有意义的。如果是这样,你会想看看编辑距离,其中一个常见的就是Levenshtein distance。您可能还想考虑修改它以考虑单个值有多少差异(但这不是微不足道的)。

对于像 set之类的东西,元素是可以互换的,但元素上并没有严格的顺序({1, 2, 3}与 相同{3, 1, 2})。如果是这种情况,最简单的可能是对值进行排序并仅使用编辑距离。您还可以通过某种方式同时循环遍历两者,这样您就可以更轻松地考虑值之间的差异。

于 2013-11-06T15:16:17.130 回答
2

你的问题让我想起了找到一个汉明距离。基本上,两个对象之间的汉明距离是一个对象中必须更改以使其与另一个对象匹配的元素的数量。也有类似的度量(Damerau-Levenshtein 距离欧几里得距离等)。

在如何实现这一点上,您有多种选择。例如,{1,3,4} 和 {1,7,4} 之间的距离是 1(因为一个元素发生了变化)还是 4(因为变化的幅度)?您实际定义距离的方式在很大程度上取决于您的问题的上下文,并且不一定有正确的答案。

于 2013-11-06T15:12:59.660 回答