2012-02-11 216 views
2

我是Java新手,第二天!我想要生成正態分佈的樣本。我正在使用逆轉換。如何在Java中生成正常的累積分佈?它的逆cdf?對數正態值如何?

基本上,我想找到逆正態累積分佈,然後找到它的逆。並生成樣本。

我的問題是:是否有一個內置函數反向正常cdf?還是我必須手動編碼?

我已經看到人們在Apache公共資源上提到this。這是一個內置的?還是我必須下載它?

如果我必須自己做,你能給我一些提示嗎?如果我下載,我的教授是否也必須安裝「包」或特殊文件?

在此先感謝!

編輯:剛剛找到我不能使用庫,也聽說有更簡單的方法轉換正常使用弧度。

+0

作爲一個經驗法則,Java運行時不包括'java。*'或'javax。*'以外的包。 – Viruzzo 2012-02-11 18:47:46

+0

得到它,我們需要編寫我們的代碼來模擬正態分佈的樣本,均值= 10,方差= 2。那麼,我猜想任何下載或軟件包都會很糟糕? – user1061210 2012-02-11 18:53:58

+0

@AdelBoutros:下面的答案很好,但是對正態cdf使用反變換的正確答案是首先從uniform(0,1)中繪製,然後使用box-muller變換公式,它們是正弦函數和餘弦函數。無需包裝或編碼。 – user1061210 2012-08-21 22:11:41

回答

-1

我從來沒有嘗試過,但來自算法團隊的人使用Colt,他們對結果感到滿意。

+0

據我所知,Colt沒有提供反向累積分佈函數的函數。 – steffen 2012-08-20 08:30:54

+0

感謝您的鏈接。這很有趣。但是1)OP知道dist,所以爲什麼要用近似值來擾亂我的有限知識,似乎用插值來估計逆cdf並不像看起來那樣直截了當(合理的精度,合理的計算時間)。我只問了一個關於[這裏]的問題(http:// stackoverflow。COM /問題/ 12034782 /如何對計算-的逆累積分佈函數式的Java)。請考慮使用小馬添加一個答案,我會高興地道歉,upvote和接受(在這裏沒有諷刺!):) – steffen 2012-08-21 06:48:44

+0

@steffen,不要打擾 – aviad 2012-08-21 16:40:54

2

正如提到here

Apache Commons - Math有你在找什麼。

更具體地說,檢查NormalDistrubitionImpl類。

而且沒有你的教授並不需要下載的東西,如果你爲他提供所有需要的庫。

UPDATE:

如果你想手工代碼(我不知道實際的公式),你可以查看以下鏈接: http://home.online.no/~pjacklam/notes/invnorm/

有2人誰實現了它在Java中:http://home.online.no/~pjacklam/notes/invnorm/#Java

+0

所以,我仍然需要給他發我的圖書館?是否有可能只提交一個文件爲我的硬件? – user1061210 2012-02-11 18:51:25

+0

是的,如果你建立一個JAR文件並設置清單。您可以包含引用的庫。 當然,除非他真的希望你自己寫出方法作爲分配的一部分 – fishtoprecords 2012-02-11 19:15:06

+0

@fishtoprecords是正確的。建立一個罐子是最好的方法 – 2012-02-11 19:47:38

2

我有過同樣的問題,並找出其解決方案,下面的代碼將給出累積分佈函數一樣,Excel中的結果做:

private static double erf(double x) 
{ 
    //A&S formula 7.1.26 
    double a1 = 0.254829592; 
    double a2 = -0.284496736; 
    double a3 = 1.421413741; 
    double a4 = -1.453152027; 
    double a5 = 1.061405429; 
    double p = 0.3275911; 
    x = Math.abs(x); 
    double t = 1/(1 + p * x); 
    //Direct calculation using formula 7.1.26 is absolutely correct 
    //But calculation of nth order polynomial takes O(n^2) operations 
    //return 1 - (a1 * t + a2 * t * t + a3 * t * t * t + a4 * t * t * t * t + a5 * t * t * t * t * t) * Math.Exp(-1 * x * x); 

    //Horner's method, takes O(n) operations for nth order polynomial 
    return 1 - ((((((a5 * t + a4) * t) + a3) * t + a2) * t) + a1) * t * Math.exp(-1 * x * x); 
} 
public static double NORMSDIST(double z) 
{ 
    double sign = 1; 
    if (z < 0) sign = -1; 

    double result=0.5 * (1.0 + sign * erf(Math.abs(z)/Math.sqrt(2))); 
    return result; 
} 
相關問題