在Python

时间:2017-09-20 21:55:30

标签: python sorting math average standard-deviation

给出排序列表

item_list = [41, 53, 54, 57, 315, 324, 340]

我如何找到与其平均值相比标准差最小的三个值?这个例子的正确答案是这三个值

answer = [53, 54, 57]

他们的平均值为54,66,标准差为1,55。任何其他组合都会产生更高的标准偏差。

此时我能想到的只是遍历可用选项并计算每个选项。鉴于这7个项目列表将是7 * 6 * 5 = 210个选项我相信。但由于在我的实际应用中,列表要长得多,这可能会导致问题。

此外,随着列表大小的增加,我需要为4,5,6等数量的元素做同样的事情。

编辑:

我相信这不是重复。没有代码示例,因为我没想到我的这个伪代码的嵌套实现;

for item in item_list:
  # calculate average with all variations of 2 other elements
  for each average:
    # calculate standard deviation

非常有用,也不可读。我试图从头开始介绍最小的可行案例,并且真的不知道从那里去哪里。

2 个答案:

答案 0 :(得分:1)

假设一个排序列表和一个函数pstdev,它找到列表的总体标准:

list = [41, 53, 54, 57, 315, 324, 340]
size = 3
subset = list[:size]
minstd = pstdev(list[:size])
for i in range(size, len(list)):
    std = pstdev(list[i-size:i])
    if(std < minstd):
        minstd = std
        subset = list[i-size:i]

print(subset)
print(minstd)

这是O(n),我相信,无论你尝试什么技巧,你都可以做到最好。

没有numpy的标准来自:https://stackoverflow.com/a/27758326/5013193

答案 1 :(得分:1)

这是NumPy和itertools的实现。

import itertools
import numpy as np

item_list = [41, 53, 54, 57, 315, 324, 340]
combos = np.array(list(itertools.combinations(item_list, 3)))
s = combos.std(axis=1).argmin()
print(combos[s].tolist())
# [53, 54, 57]