2014-09-25 100 views
1

我必須爲泊松分佈生成數據。我的範圍是n = 1000到100K。其中n是數據元素的數量; k從1到n不等。它說使用lambda作爲n/2Java中的泊松分佈(正確性?)

我從來沒有拿過統計數據,也不知道如何在這裏得到正確的曲線。我可以餵它lambda爲n/2,但我是否從0-n變化K?我試過這個(把k作爲參數傳入),當我繪製數據時,它會上升,而不是魚尾。我做錯了什麼,或者我做得對嗎?

謝謝

我在Knuth的java中有這樣的代碼。

static double poissonRandomNumber(int lambda) { 
    double L = Math.exp(-lambda); 
    int k = 0; 
    double p = 1; 
    do { 
     k = k + 1; 
     double u = Math.random(); 
     p = p * u; 
    } while (p > L); 
    return k - 1; 
} 
+1

您需要知道什麼函數爲泊松分佈開始:http://en.wikipedia.org/wiki/Poisson_distribution。如果您可以使用庫,請嘗試Apache Commons Math:https://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/distribution/PoissonDistribution.html – duffymo 2014-09-25 19:50:19

+0

該函數的給定爲f (K,λ)= Pr(k)=λ^ ke^lambda/k! e =自然對數2.71 ...我不知道該怎麼做,我不知道我在這裏做什麼。我試圖插入圖片中的forumla,並沒有採取。 – 2014-09-25 20:03:23

+1

這與我發佈的鏈接一致。 – duffymo 2014-09-25 20:05:05

回答

0

您遇到的一個問題是計算機如何使用floating point numbers來表示和執行計算的基本限制。

實數以類似於科學記數法的形式的計算機上表示:

有效位×基^指數

對於雙精度數,有用於11個比特指數和52爲「有效位數」部分。因爲浮點數是歸一化的,所以第一個正浮點數> 0.0的值約爲10^-320(這在Java中定義爲Double.MIN_VALUE)。請參閱IEEE Standard 754 Floating Point Numbers以獲得有關此方面的優秀資料。

考慮的代碼行:

double L = Math.exp(-lambda); 

隨着1000的λ,E 1 -1000(大約是10^-435)小於Double.MIN_VALUE,和沒有辦法的計算機可以代表E 1 -1000任何不同於它可以代表E 1 -100000

你可以解決這個問題注意到lambda是一個「到達率」,你可以計算出更短間隔的隨機樣本並對它們進行求和。也就是說

x = p(L); 

可以計算爲

x = p(L/2) + p(L/2); 

和較大的數字可以近似:

x = 100 * p(L/100); 

Wikipedia article has on the Poisson distribution有一些很好的指針的方式來計算的較大值泊松分佈拉姆達。