我有两个排名项目列表。每个项目都有一个排名和一个相关的分数。 得分决定了排名。这两个列表可以包含(通常也可以)不同的项目,即它们的交集可以为空。我需要采取措施来比较这些排名。 是否有众所周知的算法(在文献或现实世界系统中)? 距离的度量应考虑分数以及项目的等级。
答案 0 :(得分:10)
此问题以前从未得到过回答,但我仍然认为对很多人来说这很重要:
普通相关性测试无法满足您的两个要求,即列表的非联合和排名的重要性。除此之外(例如Kendall-Tau)不考虑订单:
>>> from scipy.stats import kendalltau
>>> kendalltau([1,2,3,4,5], [2,1,3,4,5])
KendalltauResult(correlation=0.79999999999999982, value=0.050043527347496564)
>>> kendalltau([1,2,3,4,5], [1,2,3,5,4])
KendalltauResult(correlation=0.79999999999999982, value=0.050043527347496564)
第一个比较应该产生比第二个比较小得多的值,因为列表的头部比尾部(第二个要求)更重要。
除此之外,我们可以看到两个列表需要具有相同的大小并且具有相同类型的元素(第一个要求)
可能的解决方案:
满足您所有需求的措施称为Rank Biased Overlap。它是所谓的基于平均值的重叠的概括,这在blog中得到了很好的说明。 同一个人也推出了implementation RBO。
2018年1月更新:
答案 1 :(得分:1)
也许不能完全解决问题,但绝对值得一看Kendall's weighted tau。
当订单很重要时,它提供了一种计算排名列表之间相似性的更好方法,因为它允许基于排名顺序进行任意加权。
例如,人们可能更感兴趣的是在列表的前20项中增加相似度而不是统一。
在scipy中也有一个很好的实现。
答案 2 :(得分:0)
有许多措施可以比较前k(排名)列表。一些非常微不足道的计算做出几个简化的假设,其他的不是那么微不足道,但在评估列表之间的排名相似性时更严格。我最近发现的一篇论文以统计学上有意义的方式处理这个问题,使用来自信息理论和数据压缩的概念:http://arxiv.org/abs/1310.0110