1. 定义:
肯德尔相关系数可以测量两个随机序列的相关性,肯德尔相关系数被定义为:
τ
=
2
n
(
n
−
1
)
∑
i
<
j
σ
(
x
i
−
x
j
)
σ
(
y
i
−
y
j
)
\tau = \frac{2}{{n(n - 1)}}\sum\limits_{i < j} {\sigma ({x_i} - {x_j})\sigma ({y_i} - {y_j})}
τ=n(n−1)2i<j∑σ(xi−xj)σ(yi−yj)
其中,
σ
(
x
)
=
{
1
,
x
>
0
0
,
x
=
0
−
1
,
x
<
0
\sigma (x) = \left\{ \begin{array}{l}1,{\rm{x > 0}}\\0,{\rm{x = 0}}\\ - 1,{\rm{x < 0}}\end{array} \right.
σ(x)=⎩⎨⎧1,x>00,x=0−1,x<0
x,y 分别表示两个序列,肯德尔相关系数τ 的值域为-1 到 1 之间。当 τ=1时,表示两个序列具有完全一致的相关性;当 τ=-1 时,表示两个序列拥有完全相反的相关性;当 τ=0 时,表示这对序列组是不相关的,而 τ≠0 则可以认为两个序列具有一定的相关性。
2. python实现
from scipy.stats import kendalltau
import numpy as np
def sckendall(a, b):
'''
会与scipy源码中计算的有一定差距
'''
L = len(a)
count = 0
for i in range(L - 1):
for j in range(i + 1, L):
count = count + np.sign(a[i] - a[j]) * np.sign(b[i] - b[j])
kendall_tau = count / (L * (L - 1) / 2)
return kendall_tau
if __name__ == '__main__':
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [3, 7, 2, 1, 4, 8, 6, 10, 5, 9]
kendall_tau_2, p_value = kendalltau(a, b)
kendall_tau = sckendall(a, b)
print(kendall_tau)
print(kendall_tau_2)