这两个排名之间的 Kendall Tau 距离是多少?

机器算法验证 公制 肯德尔陶
2022-03-30 02:44:08

排名 i: {3, 1, 2}

排名 j: {2, 1, 3}

我在这里指的是维基百科页面,要计算肯德尔距离,我只需要计算排名 i 中的值与排名 j 中的值顺序相反的次数。

排名 i 3 < 1,但排名 j 3 > 1

排名 i 3 < 2,但排名 j 3 > 2

排名 i 1 < 2,但排名 j 1 > 2

有 3 个开关,所以 Kendall 距离为 3。但是,当我调用一个函数来计算 R 中的 Kendall 距离时,它返回 1。这 2 个排名之间的正确 Kendall 距离是多少?

4个回答

错误的答案被接受了!正确答案是 3。

来自维基百科:Kendall tau 距离也称为冒泡排序距离,因为它等于冒泡排序算法将一个列表以与另一个列表相同的顺序放置的交换次数。

import itertools

def kendall_tau_distance(order_a, order_b):
    pairs = itertools.combinations(range(1, len(order_a)+1), 2)
    distance = 0
    for x, y in pairs:
        a = order_a.index(x) - order_a.index(y)
        b = order_b.index(x) - order_b.index(y)
        if a * b < 0:
            distance += 1
    return distance

print kendall_tau_distance([3,1,2], [2,1,3])
3

在您的情况下,Kendall tau 距离确实是 1。

请参阅以下 python 代码:

import itertools

def kendallTau(A, B):
    pairs = itertools.combinations(range(0, len(A)), 2)

    distance = 0

    for x, y in pairs:
        a = A[x] - A[y]
        b = B[x] - B[y]

        # if discordant (different signs)
        if (a * b < 0):
            distance += 1

    return distance


ranking_i = [3, 1, 2]
ranking_j = [2, 1, 3]
assert kendallTau(ranking_i, ranking_j) == 1

在这种情况下,Kendall tau 距离为 3。它也称为 Kemeny 距离。这里这里

在某些领域,排名也允许有平局,因此 Kemeny 可以被视为 6 而不是 3 的距离。这是一个经常出现的混淆。但是在您的情况下,它3,因为不允许领带。

Kendell tau 距离是使两个列表相同所需的交换次数。它也可以被认为是插入排序的一种变体,其中每次交换都会使 Kendell 距离增加 +1。