假设我们有一组x
N
个值{x_i; i=1,...,N}
和一组相关概率{w_i; i=1,...,N}
。
我们希望通过从集合{{中选择每个值x
,从x^
集N
{x^_i; i=1,...,N}
个值x_i
中获取x
1}}根据概率w_i
。我们如何编码(即伪代码算法,可以翻译成任何语言)。
编辑:python代码:
def resample(self,x,w):
N = len(w)
new_x = empty(N)
c = cumsum(w)
for i in range(N):
r = random()
for j in range(N):
if( j == N-1 ):
new_x[i] = x[j]
break
else:
if( (c[j] <= r) and (r < c[j+1]) ):
new_x[i] = x[j+1]
break
new_w = ones(N,dtype=float)/N
return new_x, new_w
答案 0 :(得分:4)
你可以调用一个函数,它给你一个介于0和1之间的随机数
如果概率为w_1 = 0.2,w_2 = 0.5,w_3 = 0.3,则可以:
如果您的数字介于0到0.2之间,请选择x_1
如果您的数字介于0.2和0.7之间,请选择x_2
另外选择x_3。
更一般地,如果w_1 + ... + w_(n-1)&lt; =随机数&lt; w_1 + ... + w_(n-1)+ w_n
这不是整个伪代码,只是对其最有问题的部分的解释,但我认为如果您对问题有基本的了解就足够了。
答案 1 :(得分:1)
我认为最好的选择是预处理概率集然后获得随机值。
让我解释一下我的意思:
首先创建一个新集合,例如h_i,其中放置每个对象的累积概率。
x_i:{A,B,C,D}
w_i:{0.2,0.3,0.4,0.1}
h_i:{0.2,0.5,0.9,1}
最后一个元素当然是1.(但如果不是(你有丢失的情况)它仍然有用。
现在生成0≤r≤1的随机数并查找h大于r的第一个元素。
例如,如果你得到0.56,你选择C因为0.9(h_C)&gt; 0.56和0.5(h_B)≤0.56
此操作在数组上可能很昂贵,但如果您选择二叉搜索树来存储集合h_i,则可以获得非常好的结果。
即如果您想在相同的概率集上选择大量随机值。如果该组不断变化,我会使用另一种方法。
答案 2 :(得分:0)
# import the random library
import random
# define the input data
X = ["A","B","C","D"]
w = [0.2,0.3,0.4,0.1]
# size of the new sample
n = 10
# empy list to store the result
Xp = []
# the actual code
while len(Xp) < n:
random_choice = random.choice(w)
if random_choice >= random.random():
Xp.append(X[w.index(random_choice)])
# have a look
Xp
缺货[39]:
['C','C','C','B','D','B','A','D','A','B']