排名 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 距离是多少?
排名 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 距离是多少?
错误的答案被接受了!正确答案是 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
Kendell tau 距离是使两个列表相同所需的交换次数。它也可以被认为是插入排序的一种变体,其中每次交换都会使 Kendell 距离增加 +1。