Kendall tau distance

From HandWiki

The Kendall tau rank distance is a metric that counts the number of pairwise disagreements between two ranking lists. The larger the distance, the more dissimilar the two lists are. Kendall tau distance is also called bubble-sort distance since it is equivalent to the number of swaps that the bubble sort algorithm would take to place one list in the same order as the other list. The Kendall tau distance was created by Maurice Kendall.


The Kendall tau ranking distance between two lists [math]\displaystyle{ \tau_1 }[/math] and [math]\displaystyle{ \tau_2 }[/math] is

[math]\displaystyle{ K(\tau_1, \tau_2) = |\{(i,j): i \lt j, ( \tau_1(i) \lt \tau_1(j) \wedge \tau_2(i) \gt \tau_2(j) ) \vee ( \tau_1(i) \gt \tau_1(j) \wedge \tau_2(i) \lt \tau_2(j) )\}|. }[/math]


  • [math]\displaystyle{ \tau_1(i) }[/math] and [math]\displaystyle{ \tau_2(i) }[/math] are the rankings of the element [math]\displaystyle{ i }[/math] in [math]\displaystyle{ \tau_1 }[/math] and [math]\displaystyle{ \tau_2 }[/math] respectively.

[math]\displaystyle{ K(\tau_1,\tau_2) }[/math] will be equal to 1 if the two lists are identical and [math]\displaystyle{ -1 }[/math] (where [math]\displaystyle{ n }[/math] is the list size) if one list is the reverse of the other. The normalized Kendall tau distance therefore lies in the interval [-1,1].

Kendall tau distance may also be defined as

[math]\displaystyle{ K(\tau_1,\tau_2) = \begin{matrix} \sum_{\{i,j\}\in P} \bar{K}_{i,j}(\tau_1,\tau_2) \end{matrix} }[/math]


  • P is the set of unordered pairs of distinct elements in [math]\displaystyle{ \tau_1 }[/math] and [math]\displaystyle{ \tau_2 }[/math]
  • [math]\displaystyle{ \bar{K}_{i,j}(\tau_1,\tau_2) }[/math] = 0 if i and j are in the same order in [math]\displaystyle{ \tau_1 }[/math] and [math]\displaystyle{ \tau_2 }[/math]
  • [math]\displaystyle{ \bar{K}_{i,j}(\tau_1,\tau_2) }[/math] = 1 if i and j are in the opposite order in [math]\displaystyle{ \tau_1 }[/math] and [math]\displaystyle{ \tau_2. }[/math]

Kendall tau distance can also be defined as the total number of discordant pairs.

Kendall tau distance in Rankings: A permutation (or ranking) is an array of N integers where each of the integers between 0 and N-1 appears exactly once. The Kendall tau distance between two rankings is the number of pairs that are in different order in the two rankings. For example, the Kendall tau distance between 0 3 1 6 2 5 4 and 1 0 3 6 4 2 5 is four because the pairs 0-1, 3-1, 2-4, 5-4 are in different order in the two rankings, but all other pairs are in the same order.[1]

If Kendall tau function is performed as [math]\displaystyle{ K(L1,L2) }[/math] instead of [math]\displaystyle{ K(\tau_1,\tau_2) }[/math] (where [math]\displaystyle{ \tau_1 }[/math] and [math]\displaystyle{ \tau_2 }[/math] are the rankings of [math]\displaystyle{ L1 }[/math] and [math]\displaystyle{ L2 }[/math] elements respectively), then triangular inequality is not guaranteed. The triangular inequality fails in cases where there are repetitions in the lists. So then we are not dealing with a metric anymore.


Suppose one ranks a group of five people by height and by weight:

Person A B C D E
Rank by height 1 2 3 4 5
Rank by weight 3 4 1 2 5

Here person A is tallest and third-heaviest, and so on.

In order to calculate the Kendall tau distance, pair each person with every other person and count the number of times the values in list 1 are in the opposite order of the values in list 2.

Pair Height Weight Count
(A,B) 1 < 2 3 < 4
(A,C) 1 < 3 3 > 1 X
(A,D) 1 < 4 3 > 2 X
(A,E) 1 < 5 3 < 5
(B,C) 2 < 3 4 > 1 X
(B,D) 2 < 4 4 > 2 X
(B,E) 2 < 5 4 < 5
(C,D) 3 < 4 1 < 2
(C,E) 3 < 5 1 < 5
(D,E) 4 < 5 2 < 5

Since there are four pairs whose values are in opposite order, the Kendall tau distance is 4. The normalized Kendall tau distance is

[math]\displaystyle{ \frac{4}{5(5 - 1)/2} = 0.4. }[/math]

A value of 0.4 indicates that 40% of pairs differ in ordering between the two lists.

Computing the Kendall tau distance

A naive implementation in Python (using NumPy) is:

import numpy as np

def normalised_kendall_tau_distance(values1, values2):
    """Compute the Kendall tau distance."""
    n = len(values1)
    assert len(values2) == n, "Both lists have to be of equal length"
    i, j = np.meshgrid(np.arange(n), np.arange(n))
    a = np.argsort(values1)
    b = np.argsort(values2)
    ndisordered = np.logical_or(np.logical_and(a[i] < a[j], b[i] > b[j]), np.logical_and(a[i] > a[j], b[i] < b[j])).sum()
    return ndisordered / (n * (n - 1))

However, this requires [math]\displaystyle{ n^2 }[/math] memory, which is inefficient for large arrays.

Given two rankings [math]\displaystyle{ \tau_1,\tau_2 }[/math], it is possible to rename the items such that [math]\displaystyle{ \tau_1 = (1,2,3,...) }[/math]. Then, the problem of computing the Kendall tau distance reduces to computing the number of inversions in [math]\displaystyle{ \tau_2 }[/math]—the number of index pairs [math]\displaystyle{ i,j }[/math] such that [math]\displaystyle{ i\lt j }[/math] while [math]\displaystyle{ \tau_2(i) \gt \tau_2(j) }[/math]. There are several algorithms for calculating this number.

  • A simple algorithm based on merge sort requires time [math]\displaystyle{ O(n \log n) }[/math].[2]
  • A more advanced algorithm requires time [math]\displaystyle{ O(n\sqrt{\log{n}}) }[/math].[3]

Here is a basic C implementation.

#include <stdbool.h>

int kendallTau(short x[], short y[], int len) {
    int i, j, v = 0;
    bool a, b;

    for (i = 0; i < len; i++) {
        for (j = i + 1; j < len; j++) {

            a = x[i] < x[j] && y[i] > y[j];
            b = x[i] > x[j] && y[i] < y[j];

            if (a || b)


    return abs(v);

float normalize(int kt, int len) {
    return kt / (len * (len - 1) / 2.0);

See also


  2. Ionescu, Vlad. "calculating the number of "inversions" in a permutation". Retrieved 24 February 2017. 
  3. Chan, Timothy M.; Pătraşcu, Mihai (2010). "Proceedings of the Twenty-First Annual ACM-SIAM Symposium on Discrete Algorithms". pp. 161. doi:10.1137/1.9781611973075.15. ISBN 978-0-89871-701-3. 
  • Fagin, R.; Kumar, R.; Sivakumar, D. (2003). "Comparing top k lists". SIAM Journal on Discrete Mathematics 17 (1): 134–160. doi:10.1137/S0895480102412856. 
  • Kendall, M. (1948). Rank Correlation Methods. Charles Griffin & Company Limited. 
  • Kendall, M. (1938). "A New Measure of Rank Correlation". Biometrika 30 (1/2): 81–89. doi:10.2307/2332226. 

External links