用于选择具有一些相关概率的N值的代码

时间:2012-06-12 13:45:16

标签: python algorithm probability probability-theory

假设我们有一组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

3 个答案:

答案 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']