微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有可以比较两个有序列表的统计测试

如何解决是否有可以比较两个有序列表的统计测试

我想获得一个统计检验统计量来比较两个列表。假设我的基准列表是

Benchmark = [a,b,c,d,e,f,g]

我还有另外两个列表

A =  [g,a,d]
C = [c,g]

我希望测试告诉我哪个列表更接近基准。测试应该考虑绝对位置,但也应该考虑相对位置,例如它应该惩罚这样一个事实,即列表 A 'g' 在开始但在基准测试中它在结束(距离有多远)它的真实位置),但它也应该奖励'a'和'b'在列表C中彼此接近的事实,就像在Benchmark中一样。 A 和 C 总是混洗的 Benchmark。我想要一个统计测试或某种指标,告诉我列表 ABC 的排序与基准的排序没有统计差异,而是某个特定的排序list D 在某个阈值或 p 值(例如 5%)处显着不同。即使在列表 ABC 中,测试也应该完美地勾勒出哪个排序更接近基准。

解决方法

好吧,如果您得出一个指标就足够了的结论,那么您就可以:

def dist(a,b):
    perm = []
    for v in b:
        perm.append(a.index(v))
        
    perm_vals = [a[p] for p in perm]
        
    # displacement
    ret = 0
    for i,v in enumerate(perm):
        ret += abs(v - i)
    
    # coherence break
    current = perm_vals.index(a[0])          
    for v in a[1:]:
        new = perm_vals.index(v)
        ret += abs(new - current) - 1
        current = new
    
    return ret

我创建了一些示例来测试:

import random

ground_truth = [0,1,2,3,4,5,6]
samples = []
for i in range(7):
    samples.append(random.sample(ground_truth,len(ground_truth)))
    
samples.append([0,6,2])
samples.append([6,0])
samples.append([0,6])

def dist(a,v in enumerate(perm):
        ret += abs(v - i)
    
    # coherence break
    current = perm_vals.index(a[0])          
    for v in a[1:]:
        new = perm_vals.index(v)
        ret += abs(new - current) - 1
        current = new
    
    return ret
        
    
for s in samples:
    print(s,dist(ground_truth,s))

度量是一种成本,即越低越好。我设计它以产生 0 如果置换是一个身份。留给您的工作是决定您在使用此指标评估样本时希望达到的严格程度,这绝对取决于您要达到的目标。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。