我需要在排序陣列中獲取選擇 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)]
謝謝!
uj5u.com熱心網友回復:
對于組合中的每個位置,可能的值是從該位置開始到最后一個 kp-1 元素的串列子集。例如,對于 1..100 中 6 的組合,位置 3 只能包含值 3..96
對于每個位置/值對,出現的次數將是左側元素的組合和右側元素的組合的乘積。
例如,對于 1..100 串列中 6 個元素的組合,45 出現在第三個位置的次數是 1..44 中 2 的組合乘以 46..100 中 3 的組合。因此,對于該位置/值對,我們將有 C(44,2) * C(55,3) * 45。
您可以對每個位置/值對重復此計算,以獲得輸出組合中每個位置的總數。然后將這些總數除以組合數以獲得預期值:
from math import comb
def countComb(N,k):
result = [0]*k
for p in range(k): # p is count on the left
q = k-p-1 # q is count on the right
for i in range(p,len(N)-q):
left = comb(i,p) # combinations on the left >= 1
right = comb(len(N)-i-1,q) # combinations on the right >= 1
result[p] = left * right * N[i]
return result
def combProb(N,k):
Cnk = comb(len(N),k)
return [S/Cnk for S in countComb(N,k)]
輸出:
print(countComb([1,2,3],2)) # [4, 8]
print(combProb([1,2,3],2)) # [1.3333333333333333, 2.6666666666666665]
print(countComb([1,2,3,4,5],3)) # [15, 30, 45]
print(combProb([1,2,3,4,5],3)) # [1.5, 3.0, 4.5]
# test with large number of combinations:
print(countComb(list(range(1,301)),7))
[1521500803497675, 3043001606995350, 4564502410493025,
6086003213990700, 7607504017488375, 9129004820986050,
10650505624483725]
print(combProb(list(range(1,301)),7))
[37.625, 75.25, 112.875, 150.5, 188.125, 225.75, 263.375]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382603.html
