2010-12-14 15 views
14

私は、ソフトマックスの起動関数を途中で使用するプログラムをコーディングしようとしています。各変数のリスト変数を指定してください。

P[0.10,0.25,0.60,0.05] 

Pのすべての変数の合計は常に1

である私は、リストのインデックスを選択する方法を求めていました:今

、私はこのような確率のリストを持っていますそれに付随する確率を考慮して。 あるいは、言い換えれば、私はここで起動する全く考えてきたん

0 - 10% of the time 
1 - 25% of the time 
2 - 60% of the time 
3 - 5% of the time 

を返される関数。どんな助けもありがとう。うーん、面白い:)

答えて

10

、どの程度...あなたの番号から各アイテムの確率をsubstractingリストをウォーク

  • 0と1の間

    1. は番号を生成します。

    2. 差し引き後、数字を0以下にしたアイテムを選んでください。あなたが探しているもの

      シンプル、O(n)のだと動作するはず

    :)

  • 2
    import random 
    
    probs = [0.1, 0.25, 0.6, 0.05] 
    r = random.random() 
    index = 0 
    while(r >= 0 and index < len(probs)): 
        r -= probs[index] 
        index += 1 
    print index - 1 
    
    +0

    母と、ここでは、私はあなたが私が元 – slezica

    +0

    @Santiagoされていたことを掲示2秒前に〜と思った:あなたが英語:) – sje397

    10

    基本的にcumulative probability distribution(CDF)配列を作成します。基本的に、与えられたインデックスのCDFの値は、そのインデックスと等しいかそれより小さいPのすべての値の合計に等しい。次に、0と1の間の乱数を生成し、バイナリ検索(または必要に応じて線形検索)を行います。ここには簡単なコードがあります。当然の

    from bisect import bisect 
    from random import random 
    
    P = [0.10,0.25,0.60,0.05] 
    
    cdf = [P[0]] 
    for i in xrange(1, len(P)): 
        cdf.append(cdf[-1] + P[i]) 
    
    random_ind = bisect(cdf,random()) 
    

    あなたは

    [2, 2, 3, 2, 2, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2] 
    

    (結果は意志、と変化すべきである)を得た

    rs = [bisect(cdf, random()) for i in xrange(20)] 
    

    ようなもので、ランダムな指標の束を生成することができます。もちろん、バイナリ検索は、できるだけ少ないインデックスに対してはむしろ不要ですが、可能性の高いインデックスを持つディストリビューションには絶対に推奨されます。

    +0

    うれしいですでそれを入力した理由を私は疑問に思いました.... – sje397

    3

    この問題は、categorical distributionからのサンプリングと同じです。この分布は、一般に、カテゴリ分布からの複数のサンプルの結果をモデル化する多項分布と矛盾しない。

    numpyでは、numpy.random.multinomialを使用して多項分布から簡単にサンプリングすることができますが、これの特定のカテゴリバージョンは存在しません。ただし、1回の試行で多項分布からサンプリングし、出力に非ゼロ要素を戻すことで実現できます。

    import numpy as np 
    pvals = [0.10,0.25,0.60,0.05] 
    ind = np.where(np.random.multinomial(1,pvals))[0][0] 
    
    15

    これは簡単にnumpyで実現できます。それは確率のパラメータを受け入れるchoice関数を持っています。

    np.random.choice(
        ['pooh', 'rabbit', 'piglet', 'Christopher'], 
        5, 
        p=[0.5, 0.1, 0.1, 0.3] 
    ) 
    
    関連する問題