【发布时间】:2022-01-15 08:59:47
【问题描述】:
我需要在排序后的数组中获取 n 选择 k 绘图的统计期望值。
例如,假设我想从以下排序数组中选择 2 个元素
[1, 2, 3]
所有可能组合的集合如下:
(1, 2)
(1, 3)
(2, 3)
所以第一个元素的期望值为(1 + 1 + 2) / 3 = 1.33,第二个元素的期望值为(2 + 3 + 3) = 2.67
这是一个使用暴力破解方法的函数,但它太慢而无法用于大型数组。 有没有更智能/更快的方法?
import itertools
import math
def combinations_expected_value(arr, k):
sums = [0] * k
l = math.comb(len(arr), k)
for comb in itertools.combinations(arr, k):
for i in range(k):
sums[i] += comb[i]
return [sums[i] / l for i in range(k)]
谢谢!
【问题讨论】:
-
您能否大致了解您需要处理的列表的大小以及您的代码所花费的时间(这可能不是最佳的)
-
我猜你的意思是
1.33而不是1.67作为第一个元素的期望值? -
@MarkDickinson 对,我编辑了原帖
-
@JCaesar 我需要处理的最坏情况大约是 k=200 和 n=10_000 现在,(n=300, k=4) 需要 500 万,(n=300, k=5) 是> 2000 万,这是不可接受的。我还应该补充一点,现在我正在使用一个近似值,我只是将数组“拆分”为 k 个部分并取每个部分的中间值(当数组值分布不均匀时这不是很好),所以我如果没有快速精确的解决方案,也可以使用近似值。
标签: python math statistics combinations combinatorics