Box-Muller 變換(Box-Muller transform)
/ BOKS-MYOO-ler /
常態分布是人人都需要模擬的那一個,然而它的 cdf 沒有閉式反函數,所以簡單的逆變換做法卡住了。Box-Muller 變換是巧妙的繞道:它把一對獨立的均勻亂數直接變成一對獨立的標準常態數,只用到一個平方根、一個對數,以及正弦與餘弦。
訣竅是用二維來想。兩個獨立的標準常態 (Z_1, Z_2) 在平面上構成一點,其聯合密度具旋轉對稱性 —— 它只取決於與原點的距離。在極座標下,角度在圓周上均勻分布,而平方半徑結果為指數分布。這兩者都容易從均勻變數生成。所以這個做法是把多變數變數變換倒著跑:取 (0, 1) 上的均勻 U_1 與 U_2,令 R = sqrt(-2 ln U_1)、角度 = 2 pi U_2,回傳 Z_1 = R cos(角度)、Z_2 = R sin(角度)。一次就得到兩個獨立的標準常態。
Box-Muller 是精確的(不是近似),易於寫成程式,也是教科書級的示範:一個聰明的變數變換如何解決直接法做不到的問題。實務注意:它成對地產生常態,且 U_1 必須嚴格為正,對數才有定義。一個更快的表親 —— 極座標(Marsaglia)形式 —— 改在單位圓盤內抽點,藉此避開三角函數。
設 U_1 = 0.5、U_2 = 0.25。則 R = sqrt(-2 ln 0.5) 約 sqrt(1.386) 約 1.177,角度 = 2 pi (0.25) = pi/2。所以 Z_1 = 1.177 cos(pi/2) = 0、Z_2 = 1.177 sin(pi/2) 約 1.177。兩個均勻變數一次就產生了兩個標準常態。
一個來自指數的半徑與一個均勻角度,組合成兩個獨立的常態。
它成對地生成常態,且需要 U_1 嚴格大於 0(否則 ln U_1 會爆掉)。要得到 Normal(mu, sigma^2),做縮放與平移:mu + sigma 乘以 Z。