2017-03-06 17 views
0

With this function我可以從正態分佈進行採樣。我想知道如何從限制在一定時間間隔[a,b]的正常分佈有效地採樣。我的微不足道的方法是從正態分佈中抽樣,如果它屬於一定的時間間隔,則保留該值,否則重新抽樣。但是,在獲得合適的值之前,可能會丟棄許多值。如何從一個正常分佈的樣本限制到一定的時間間隔,C++實現?

我也可以近似使用三角形分佈的正態分佈,但我認爲這不足夠準確。

我也可以嘗試使用累積函數,但可能這也會很慢。有沒有有效的方法來解決這個問題?

THX

+0

對於我來說,如果要從[-inf,+ inf]上的正態分佈的區間[a,b]或從[a,b]上的正態分佈的樣本中抽樣,我不清楚。或者是其他東西? – JimmyNJ

+0

我想從[a,b]上的截斷正態分佈中抽樣。即如果x不在[a,b]中,我想以概率0對值x進行採樣,否則它必須有一個正態分佈。 – user8469759

+0

計算p(( - inf,a))和p((b,inf))。從一箇中減去它們。將[(x,y))的舊公式除以[a,b]中的x Aziuth

回答

-1

你可以在你的標準庫(例如,https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00277.html)看看正常DIST功能的實現,並想出一個辦法,你約束重新實現這一點。

要理解模板庫的代碼可能會非常棘手,但如果您真的需要速度,那麼平凡的方法並不適合,特別是如果您的間隔很小。

0

正態分佈是不可或缺的,請參閱formula

std::cout << "riemann_midpnt_sum = " << 1/(sqrt(2*PI)) * riemann_mid_point_sum(fctn, -1, 1.0, 100) << '\n'; 

// where fctn is the function inside the integral 
double fctn(double x) { 
    return exp(-(x*x)/2); 
} 

輸出: 「riemann_midpnt_sum = 0.682698」 此計算正態分佈(標準)從-1到1

這是使用近似積分的riemman和。您可以從here

4

採取riemman總和我假設你知道如何變換,並從正常的標準與μ和縮放移動由σ。

如您所說,選項1是接受/拒絕。像往常一樣生成法線,如果超出範圍[a,b]則拒絕它們。這並不像你想象的那麼低效。如果p = P {a < z < b},則所需的試驗次數遵循具有參數p的幾何分佈,並且接受值之前的預期嘗試次數爲1/p。

選項2是使用逆高斯函數,如boost中的函數。計算lo = Φ(a)和hi = Φ(b),你正常的概率分別低於a和b。然後在lo和hi之間生成均勻分佈的U,然後通過逆高斯函數對得到的U集進行曲柄轉換,並重新調整以獲得期望截斷分佈的結果。

+0

爲了清楚起見,高斯和正態分佈對於同一事物是不同的名稱。 – JimmyNJ

相關問題