With this function我可以從正態分佈進行採樣。我想知道如何從限制在一定時間間隔[a,b]
的正常分佈有效地採樣。我的微不足道的方法是從正態分佈中抽樣,如果它屬於一定的時間間隔,則保留該值,否則重新抽樣。但是,在獲得合適的值之前,可能會丟棄許多值。如何從一個正常分佈的樣本限制到一定的時間間隔,C++實現?
我也可以近似使用三角形分佈的正態分佈,但我認爲這不足夠準確。
我也可以嘗試使用累積函數,但可能這也會很慢。有沒有有效的方法來解決這個問題?
THX
With this function我可以從正態分佈進行採樣。我想知道如何從限制在一定時間間隔[a,b]
的正常分佈有效地採樣。我的微不足道的方法是從正態分佈中抽樣,如果它屬於一定的時間間隔,則保留該值,否則重新抽樣。但是,在獲得合適的值之前,可能會丟棄許多值。如何從一個正常分佈的樣本限制到一定的時間間隔,C++實現?
我也可以近似使用三角形分佈的正態分佈,但我認爲這不足夠準確。
我也可以嘗試使用累積函數,但可能這也會很慢。有沒有有效的方法來解決這個問題?
THX
你可以在你的標準庫(例如,https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00277.html)看看正常DIST功能的實現,並想出一個辦法,你約束重新實現這一點。
要理解模板庫的代碼可能會非常棘手,但如果您真的需要速度,那麼平凡的方法並不適合,特別是如果您的間隔很小。
正態分佈是不可或缺的,請參閱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
採取riemman總和我假設你知道如何變換,並從正常的標準與μ和縮放移動由σ。
如您所說,選項1是接受/拒絕。像往常一樣生成法線,如果超出範圍[a,b]則拒絕它們。這並不像你想象的那麼低效。如果p = P {a < z < b},則所需的試驗次數遵循具有參數p的幾何分佈,並且接受值之前的預期嘗試次數爲1/p。
選項2是使用逆高斯函數,如boost中的函數。計算lo = Φ(a)和hi = Φ(b),你正常的概率分別低於a和b。然後在lo和hi之間生成均勻分佈的U,然後通過逆高斯函數對得到的U集進行曲柄轉換,並重新調整以獲得期望截斷分佈的結果。
爲了清楚起見,高斯和正態分佈對於同一事物是不同的名稱。 – JimmyNJ
對於我來說,如果要從[-inf,+ inf]上的正態分佈的區間[a,b]或從[a,b]上的正態分佈的樣本中抽樣,我不清楚。或者是其他東西? – JimmyNJ
我想從[a,b]上的截斷正態分佈中抽樣。即如果x不在[a,b]中,我想以概率0對值x進行採樣,否則它必須有一個正態分佈。 – user8469759
計算p(( - inf,a))和p((b,inf))。從一箇中減去它們。將[(x,y))的舊公式除以[a,b]中的x
Aziuth