2017-10-03 33 views
1

ここでnp.random.choiceを使用するにはどうすればよいですか?np.random.choice:確率が1に合わない

:私は= Pの確率でランダムな選択をしたい

>>> sum(p) 
1.0000000017347 

p=[ 1.42836755e-01, 1.42836735e-01 , 1.42836735e-01, 1.42836735e-01 
, 4.76122449e-05, 1.42836735e-01 , 4.76122449e-05 , 1.42836735e-01, 
    1.42836735e-01, 4.76122449e-05] 

通常、和pが1に等しい正確ではありませんされています は次のように、いくつかのopertationによって計算pあり

>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False) 
array([4, 3, 2, 9]) 

こちらの作品はこちら!しかし、プログラムにはエラーがあります。

Traceback (most recent call last): 
    indexs=np.random.choice(range(len(population)), population_number, p=p, replace=False) 
    File "mtrand.pyx", line 1141, in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:17808) 
ValueError: probabilities do not sum to 1 

私はpを印刷する場合:

[ 4.17187500e-05 2.49937500e-01 4.16562500e-05 4.16562500e-05 
    2.49937500e-01 4.16562500e-05 4.16562500e-05 4.16562500e-05 
    2.49937500e-01 2.49937500e-01] 

が、それはこのpでPythonシェルで、動作します:

>>> p=[ 4.17187500e-05 , 2.49937500e-01 ,4.16562500e-05 , 4.16562500e-05, 
    2.49937500e-01 , 4.16562500e-05 , 4.16562500e-05 , 4.16562500e-05, 
    2.49937500e-01 ,2.49937500e-01] 
>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False) 
array([ 9, 10, 2, 5]) 

UPDATE 精度= 15でテストしました:

np.set_printoptions(precision=15) 
print(p) 
[ 2.499375625000002e-01 2.499375000000000e-01 2.499375000000000e-01 
    4.165625000000000e-05 4.165625000000000e-05 4.165625000000000e-05 
    4.165625000000000e-05 4.165625000000000e-05 2.499375000000000e-01 
    4.165625000000000e-05] 

テスト:np.random.choiceを使用するには、この問題を解決する方法

>>> p=np.array([ 2.499375625000002e-01 ,2.499375000000000e-01 ,2.499375000000000e-01, 
    4.165625000000000e-05 ,4.165625000000000e-05, 4.165625000000000e-05, 
    4.165625000000000e-05 , 4.165625000000000e-05 , 2.499375000000000e-01, 
    4.165625000000000e-05]) 
>>> np.sum(p) 
1.0000000000000002 

?違いを見るために

+0

試し印刷 '[Pでxについてのrepr(X)]'と、 'p'はnumpyのアレイ、' p.dtype'ある場合。共通の信念にもかかわらず、 'print'の出力からただ浮動小数点シーケンスを再作成することは常に可能ではありません。 – Goyo

+0

thx。ここでnp.random.choiceを使用するにはどうすればいいですか? –

+0

それは私のために働く。あなたは[mcve]を作成するためにもっと努力する必要があります。 – Goyo

答えて

2

これはnumpyのknown issueです。所定の公差(here the source)を使用して確率の和のためのランダムな選択機能をチェック

溶液は、合計が1

例に十分に近い場合、それらの和でそれらを分割することによって確率を正規化することである。

正規化と
>>> p=[ 1.42836755e-01, 1.42836735e-01 , 1.42836735e-01, 1.42836735e-01 
, 4.76122449e-05, 1.42836735e-01 , 4.76122449e-05 , 1.42836735e-01, 
    1.42836735e-01, 4.79122449e-05] 
>>> sum(p) 
1.0000003017347 # over tolerance limit 
>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False) 

Traceback (most recent call last): 
    File "<pyshell#23>", line 1, in <module> 
    np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False) 
    File "mtrand.pyx", line 1417, in mtrand.RandomState.choice (numpy\random\mtrand\mtrand.c:15985) 
ValueError: probabilities do not sum to 1 

>>> p = np.array(p) 
>>> p /= p.sum() # normalize 
>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False) 
array([8, 4, 1, 6]) 
+1

thxしかしdosenotの仕事。 ValueError:確率は1になりません。何をするか? –

+0

@pdshah 'p/= p.sum()'で確率を正規化しようとしましたか? – user2314737

+0

はい:>>> P = np.array([0.1999600079984003、0.1999600079984003、0.1999600079984003、3.9992001599680064e-05、0.1999600079984003、3.9992001599680064e-05、3.9992001599680064e-05、0.1999600079984003、3.9992001599680064e-05、3.9992001599680064e-05]) >>> np.sum(P) 0.99999999999999978 >>> P/= p.sum() >>> np.sum(P) 1.0000000000000002 –

1

一つの方法は次のとおりです。これはおそらく、あなたの4.17187500e-05が実際に4.17187500005e-05であることを示します

numpy.set_printoptions(precision=15) 
print(p) 

the manual hereを参照してください。

+0

thx。私はその投稿にコメントを追加しました。この問題を解決するには? –

関連する問題