2016-02-02 49 views
2

目前,我有以下代碼重寫numpy.random.binomial使用For循環

def approx_binomial(n, p, size=None): 
    gaussian = np.random.normal(n*p, n*p*(1-p), size=size) 
    # Add the continuity correction to sample at the midpoint of each integral bin. 
    gaussian += 0.5 
    if size is not None: 
     binomial = gaussian.astype(np.int64) 
    else: 
     # scalar 
     binomial = int(gaussian) 
    return binomial 

然而,因爲它使用的隨機函數是不是很準確。有沒有其他方法可以使用for循環重寫函數?

我的另一個問題是如何顯示概率質量函數與成功次數的關係圖?

def approx_binomial(n, p, size=None): 
    gaussian = np.random.normal(n*p, n*p*(1-p), size=size) 
    # Add the continuity correction to sample at the midpoint of each integral bin. 
    gaussian += 0.5 
    if size is not None: 
     binomial = gaussian.astype(np.int64) 
    else: 
     # scalar 
     binomial = int(gaussian) 
    return binomial 
plt.plot(n,p) 
plt.show() 

謝謝!

+0

** 1。 **這個函數的意思是不是很準確?該函數似乎應該是返回隨機樣本。這裏有什麼隨機性來處理準確性?請在您的問題上更具體地說明您期望與所得到的結果。 ** 2。**第二個問題似乎與第一個問題相當。爲了清楚起見,請考慮將它們分成兩個帖子。 – kazemakase

+0

@kazemakase我的意思是我需要更準確地重新編碼numpy.random.binomial。我使用的當前代碼的值與您在使用上述功能時得到的值有很大差異。 – user3393463

+0

numpy的二項式有什麼問題?你可以簡單地使用它。 – kazemakase

回答

1

使用for循環從二項式分佈得到一個隨機抽樣的顯而易見的方法是:

import random 

def binomial_random_sample(n, p): 
    ret = 0 
    for j in range(n): 
     if random.random() < p: 
      ret += 1 
    return ret 

或者,如果你喜歡更簡潔的方法:

def binomial_random_sample(n, p): 
    return sum(random.random() < p for j in range(n)) 
+0

是的,我有點想了一會兒之後。不管怎麼說,多謝拉! – user3393463

0

解決您的工作方式可以在Wikipedia找到,但它是一個非常小的一部分:生成隨機樣本是來自二項分佈是 使用反演算法

的一種方式。爲此,必須計算對於從0到n的所有值k的P(X = k)的概率 。 (這些 的概率應該總計爲接近1的值,以便 涵蓋整個樣本空間。)然後通過使用linear congruential generator來生成在0和1之間均勻的樣本, 可以將計算的樣本U [0,1 ]通過使用在步驟1中計算的概率將其轉換爲離散數字 。

上面有點冗長。簡而言之,您將必須執行以下操作以從二項分佈生成一個樣本:使用概率質量函數p=pmf(n, k)來計算每個可能的k的二項式概率,並根據它們的概率隨機選擇其中一個k s

  1. 計算每個k = [0..n]的二項式分佈cdf(n, k)的累積密度函數。
  2. 生成0和1
  3. 之間的均勻分佈的隨機數r查找k爲其cdf(n, k) <= r的值。