我有两个排名项目的列表。每个项目都有一个排名和一个相关的分数。分数决定了排名。这两个列表可以包含(并且通常是)不同的项,即它们的交集可以是空的。我需要测量来比较这样的排名。有没有众所周知的算法(在文献或现实系统中)来做到这一点?距离的测量应该考虑到分数以及项目的排名。
发布于 2016-03-24 18:16:21
这个问题以前从未被回答过,但我仍然认为这对很多人来说很重要:
通常的相关性测试不能满足您的两个要求,即列表的非连接性和秩的重要性。除了它们大多数(例如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中得到了很好的说明。同一个人还发布了一个RBO的implementation。
更新2018年1月:
的另一个实现
发布于 2018-03-28 22:40:38
也许不能完全解决这个问题,但绝对值得一看Kendall's weighted tau。
它提供了一种更好的方法来计算排序列表之间的相似度,因为它允许基于排序顺序的任意权重。
例如,人们可能更感兴趣的是在列表的前20个项目中提高相似度,而不是统一地。
在scipy中也有一个很好的实现。
发布于 2015-01-29 04:35:10
有许多方法可以比较前k(排名)列表。一些非常琐碎的计算做了几个简化的假设,另一些不是那么琐碎,但在评估列表之间的排名相似性时更严格。我最近看到的一篇论文使用了信息论和数据压缩的概念,以一种统计上有意义的方式处理了这个问题:http://arxiv.org/abs/1310.0110
https://stackoverflow.com/questions/13574406
复制相似问题