给出排序列表
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
非常有用,也不可读。我试图从头开始介绍最小的可行案例,并且真的不知道从那里去哪里。
答案 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]