2010-12-14 189 views
14

我一直在試圖編寫一個程序,在中間使用softmax激活函數。選擇列表變量給定每個變量的概率

現在,我有這樣的可能性的列表:

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

嗯有意思,怎麼樣...

  1. 生成一個數字0和1之間

  2. 走在名單從你的電話號碼從其減去每個項目的可能性。

  3. 選擇減法後將您的編號降至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 2010-12-14 08:41:30

+0

@Santiago前2秒:我不知道爲什麼你的英文:) – sje397 2010-12-14 08:54:50

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()) 

當然也可以產生類似

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

一堆東西隨機指數的收益

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

(結果,而應該有所不同)。當然,二叉搜索對於很少可能的指數來說是不必要的,但是對於具有更多可能指數的分佈,絕對建議使用二分搜索。

+0

這很好鍵入它.... – sje397 2012-09-20 10:34:19

3

此問題相當於從categorical distribution取樣。這種分佈通常與對分類分佈中的多個樣本的結果進行建模的多項分佈相混合。

在numpy中,使用numpy.random.multinomial很容易從多項分佈中進行採樣,但是不存在特定的分類版本。但是,它可以通過從多項分佈中採樣進行一次試驗,然後返回輸出中的非零元素。

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] 
)