0

値のセットxといくつかの関連する確率のセットがあるとします。N{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を取得した場合、0.9(h_C)> 0.56および0.5(h_B)≤0.56であるため、Cを選択します。

この操作は配列ではコストがかかる可能性がありますが、セット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 に答える