Mik*_*ley 15
这个问题以前从未得到过回答,但我仍然认为这对很多人来说很重要:
普通相关性测试不能满足您的两个要求,即列表的非联合性和等级的重要性.除此之外,其中大多数(例如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)
Run Code Online (Sandbox Code Playgroud)
第一个比较应该产生比第二个更小的值,因为列表的头部比尾部更重要(第二个要求).
除此之外,我们可以看到两个列表需要具有相同的大小并且具有相同类型的元素(第一个要求)
可能的方法:
满足您所有需求的措施称为秩偏差重叠.这是所谓的基于平均值的重叠的概括,这在本博客中得到了很好的说明.同一个人也推出了RBO 的实现.
2018年1月更新:
也许不能完全解决问题,但绝对值得一看Kendall 的加权 tau。
当顺序很重要时,它提供了一种计算排名列表之间相似性的更好方法,因为它允许基于排名顺序的任意加权。
例如,人们可能对增加列表前 20 项中的相似性而不是统一加权更感兴趣。
在scipy 中也有一个很好的实现。
小智 1
有许多方法可以比较前 k 个(排名)列表。有些计算起来非常简单,需要做出一些简化的假设,而另一些则不那么简单,但在评估列表之间的排名相似性时更加严格。我最近发现的一篇论文使用信息论和数据压缩的概念,以统计上有意义的方式处理这个问题:http://arxiv.org/abs/1310.0110