计算样本基尼系数的一种方法是使用相对平均差 (RMD),它是基尼系数的 2 倍。RMD 取决于由下式给出的平均差:
所以我需要计算样本中一对元素之间的每个差异(yi - yj)
。我花了很多时间才想出一种方法来做到这一点,但我想知道是否有一个函数可以为你做到这一点。
起初我试过这个,但我敢打赌它在大数据集中非常慢(顺便说一下,s 是样本):
In [124]:
%%timeit
from itertools import permutations
k = 0
for i, j in list(permutations(s,2)):
k += abs(i-j)
MD = k/float(len(s)**2)
G = MD / float(mean(s))
G = G/2
G
10000 loops, best of 3: 78 us per loop
然后我尝试了以下不太容易理解但更快的方法:
In [126]:
%%timeit
m = abs(s - s.reshape(len(s), 1))
MD = np.sum(m)/float((len(s)**2))
G = MD / float(mean(s))
G = G/2
G
10000 loops, best of 3: 46.8 us per loop
有什么有效但易于概括的东西吗?例如,如果我想对三个索引求和怎么办?
这是我使用的示例:
sample = array([5487574374, 686306, 5092789, 17264231, 41733014,
60870152, 82204091, 227787612, 264942911, 716909668,
679759369, 1336605253, 788028471, 331434695, 146295398,
88673463, 224589748, 128576176, 346121028])
gini(sample)
Out[155]:
0.2692307692307692
谢谢!