计算两个列表之间的相似性

时间:2012-02-20 17:03:22

标签: algorithm search statistics probability information-retrieval

编辑: 因为每个人都感到困惑,我想简化我的问题。我有两个有序列表。现在,我只想计算一个列表与另一个列表的相似程度。

例如,

1,7,4,5,8,9
1,7,5,4,9,6

这两个列表之间的相似性有多好,以便顺序很重要。例如,我们应该惩罚相似性,因为在两个列表中交换了4,5?

我有2个系统。一个最先进的系统和我实施的一个系统。给定查询,两个系统都返回排序的文档列表。现在,我想比较我的系统和“最先进的系统”之间的相似性,以便衡量我的系统的正确性。请注意,文档的顺序很重要,因为我们正在讨论排名系统。 有没有人知道任何可以帮助我找到这两个列表之间相似性的措施。

7 个答案:

答案 0 :(得分:15)

DCG [折扣累积增益]和nDCG [标准化DCG]通常是排名列表的一个很好的衡量标准。

如果相关文档排名第一,它会给出相关文档的全部收益,并且随着排名的降低,收益会减少。

使用DCG / nDCG评估系统与SOA基线的比较:

注意:如果您将“最先进系统”返回的所有结果设置为相关,那么如果他们使用DCG / nDCG获得相同排名,那么您的系统与现有技术相同

因此,可能的评估可能是:DCG(your_system)/DCG(state_of_the_art_system)

为了进一步增强它,您可以给出相关性等级[相关性不是二进制] - 并且将根据每个文档在现有技术中的排名来确定。例如,对于现有技术系统中的每个文档,rel_i = 1/log(1+i)

如果此评估函数收到的值接近1:您的系统与基线非常相似。

示例:

mySystem = [1,2,5,4,6,7]
stateOfTheArt = [1,2,4,5,6,9]

首先根据最新系统[使用上面的公式]给每个文档打分:

doc1 = 1.0
doc2 = 0.6309297535714574
doc3 = 0.0
doc4 = 0.5
doc5 = 0.43067655807339306
doc6 = 0.38685280723454163
doc7 = 0
doc8 = 0
doc9 = 0.3562071871080222

现在您计算DCG(stateOfTheArt),并使用上述相关性[注意相关性不是二进制,并获取DCG(stateOfTheArt)= 2.1100933062283396
接下来,使用相同的评估权重计算系统并获取:DCG(mySystem) = 1.9784040064803783

因此,评估为DCG(mySystem)/DCG(stateOfTheArt) = 1.9784040064803783 / 2.1100933062283396 = 0.9375907693942939

答案 1 :(得分:4)

Kendalls tau是您想要的指标。它测量列表中成对反转的数量。斯皮尔曼的脚步也是如此,但是测量距离而不是倒置。它们都是为手头的任务而设计的,用于衡量两个等级排序列表的差异。

答案 2 :(得分:2)

正如您所说,您想要计算一个列表与另一个列表的相似程度。我认为简单来说,你可以从计算反转次数开始。有一个O(NlogN)分而治之的方法。这是一种非常简单的方法来衡量两个列表之间的“相似性”。

例如你想比较一下音乐网站上两个人的音乐品味的“相似”,你可以对一组歌曲进行排名并计算一下。反转的。数量越少,他们的口味就越“相似”。

由于您已经在考虑将“最先进的系统”作为正确性的基准,因此计算反转应该为您提供排名的“相似性”的基本衡量标准。 当然,这只是一个初学者的方法,但你可以建立它,因为你想要与“反转差距”等有多严格。

    D1 D2 D3 D4 D5 D6
    -----------------
R1: 1, 7, 4, 5, 8, 9  [Rankings from 'state of the art' system]
R2: 1, 7, 5, 4, 9, 6  [ your Rankings]

由于排名按文档顺序排列,您可以根据R1编写自己的比较器功能(“最先进系统”的排名,因此计算与该比较器相比的反转。

对于发现的每个反转,您可以“惩罚”“相似性”: i< j但R2 [i]>' R2 [j]
>'在这里使用自己的比较器)

您可能会觉得有用的链接:
Link1
Link2
Link3

答案 3 :(得分:2)

除了已经说过的内容之外,我还想指出以下优秀论文:W. Webber et al, A Similarity Measure for Indefinite Rankings (2010)。除了对现有措施进行了很好的回顾(例如上面提到的Kendall Tau和Spearman的脚趾)之外,作者还提出了一种直观吸引人的概率测量方法,该方法适用于不同长度的结果列表,当并非所有项目都出现在两者中时名单。粗略地说,它通过"持久性"进行参数化。在检查项目k(而不是放弃)之后用户扫描项目k + 1的概率p。 Rank-Biased Overlap(RBO)是用户停止阅读时预期的结果重叠率。

RBO的实施稍微复杂一些;您可以查看Apache Pig here中的实现。

另一个简单的度量是余弦相似度,两个向量之间的余弦,其维度对应于项目,反向排名为权重。但是,它不会优雅地处理只出现在其中一个列表中的项目(请参阅上面链接中的实现)。

  1. 对于列表1中的每个项目i,让h_1(i)= 1 / rank_1(i)。对于列表2中未出现在列表1中的每个项目i,让h_1(i)= 0.对于列表2的h_2,执行相同的操作。
  2. 计算v12 = sum_i h_1(i)* h_2(i); v11 = sum_i h_1(i)* h_1(i); v22 = sum_i h_2(i)* h_2(i)
  3. 返回v12 / sqrt(v11 * v22)
  4. 对于您的示例,此值为0.7252747。

    请让我在你的直接问题之外给你一些实用的建议。除非你的生产系统'基线是完美的(或者我们正在处理黄金集),比较质量测量(例如上面提到的nDCG)而不是相似性几乎总是更好;新的排名有时会更好,有时甚至比基线差,你想知道前一种情况是否比后者更常见。其次,相似性度量在绝对尺度上解释并不容易。例如,如果你得到的相似度分数为0.72,这是否意味着它真的相似或显着不同?相似度量更有助于说明新的排名方法1比另一种新的排名方法2更接近生产。

答案 4 :(得分:1)

我想你在谈论比较两个信任检索系统,它相信我并不是一件小事。这是一个复杂的计算机科学问题。

要衡量相关性或进行A / B测试,您需要做几件事:

  1. 衡量相关性的竞争对手。由于您有两个系统,因此满足此先决条件。

  2. 您需要手动为结果评分。您可以要求您的同事对热门查询的查询/网址对进行评分,然后对于漏洞(即查询/网址对未评级,您可以通过使用“学习排名”算法http://en.wikipedia.org/wiki/Learning_to_rank来获得一些动态排名功能。不要对此感到惊讶,但那是真的(请阅读下面的Google / Bing示例)。

  3. Google和Bing是横向搜索市场的竞争对手。这些搜索引擎在世界各地使用手工评委,并在其上投入数百万美元,对查询结果进行评级。因此,对于每个查询/网址对,通常对前3个或前5个结果进行评级。根据这些评级,他们可能会使用像NDCG(标准化折扣累积增益)这样的指标,这是最好的指标之一,也是最受欢迎的指标之一。

    根据维基百科:

    折扣累积增益(DCG)衡量Web搜索引擎算法或相关应用程序的有效性,通常用于信息检索。使用搜索引擎结果集中的文档的分级相关性比例,DCG基于其在结果列表中的位置来测量文档的有用性或增益。增益从结果列表的顶部累积到底部,每个结果的增益在较低的等级上打折。

    维基百科以极好的方式解释NDCG。这是一篇简短的文章,请仔细阅读。

答案 5 :(得分:1)

文件清单是否详尽无遗?也就是说,系统1排序的每个文档排名是否也按系统2排序?如果是这样a Spearman's rho可能符合您的目的。当他们不共享相同的文档时,最大的问题是如何解释该结果。我不认为有一个测量可以回答这个问题,尽管可能会有一些实现隐含的答案。

答案 6 :(得分:1)

我实际上为此目的知道了四种不同的措施。

已经提到了三个:

  • NDCG
  • Kendall的Tau
  • Spearman的Rho

但如果你有两个以上的等级必须进行比较,请使用 Kendall的W