在Python中对一对(或更多)索引求和

2024-09-27 17:53:45 发布

您现在位置:Python中文网/ 问答频道 /正文

计算样本基尼系数的一种方法是使用基尼系数2倍的相对平均差(RMD)。RMD取决于平均差,由下式得出:

enter image description here

所以我需要计算一个示例(yi - yj)中元素对之间的每个差异。我花了不少时间才想出一个办法,但我想知道是否有一个函数可以为您实现这一点。在

我首先尝试了大量的数据,但这是非常缓慢的:

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

然后我尝试了以下不太容易理解但速度更快的方法:

^{pr2}$

有没有什么东西既有效又容易概括?例如,如果我想对三个指数求和呢?在

这是我使用的样本:

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

谢谢!在


Tags: sample方法元素示例时间差异floatmd
1条回答
网友
1楼 · 发布于 2024-09-27 17:53:45

对于您给出的MD示例,可以通过排序来利用它,您可以实现O(N*Log(N))而不是O(N^2)

y = [2,3,2,34]

def slow(y):
    tot = 0
    for i in range(len(y)):
        for j in range(len(y)):
            if i != j:
                tot += abs(y[i] - y[j])
    return float(tot)/len(y)**2

print slow(y)

def fast(y):
    sorted_y = sorted(y)
    tot = 0
    for i, yi in enumerate(sorted_y):
        smaller = i
        bigger = len(y) - i - 1
        tot += smaller * yi - bigger * yi
    return float(2*tot)/len(y)**2

print fast(y)

通常,您必须使用动态编程或其他技术来加快速度,我不确定是否有“一种方法适合所有人”的解决方案。在

相关问题 更多 >

    热门问题