0

假设我们有一组xN{x_i; i=1,...,N}一组相关的概率{w_i; i=1,...,N}

我们希望通过根据概率从集合中选择每个值来从集合中获得x一组新x^N值。我们如何编码(即伪代码算法,可以翻译成任何语言)。{x^_i; i=1,...,N}x_ixw_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
4

3 回答 3

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_3。

更一般地说,如果 w_1 + ... + w_(n-1) <= 随机数 < w_1 + ... + w_(n-1) + w_n,则选择 x_n

这不是整个伪代码,只是对其最有问题的部分的解释,但我认为如果你对你的问题有一个基本的了解就足够了。

于 2012-06-12T13:59:20.577 回答
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) > 0.56 并且 0.5(h_B) ≤ 0.56

此操作在数组上可能会很昂贵,但如果您选择二叉搜索树来存储集合 h_i,您可以获得非常好的结果。

也就是说,如果您想在同一概率集中选择大量随机值。如果集合不断变化,我会使用另一种方法。

于 2012-06-12T14:01:54.670 回答
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']

于 2014-11-18T00:42:58.630 回答