如果 exp(X) ~ Gamma,如何快速採樣 X?
我有一個簡單的採樣問題,我的內部循環如下所示:
v = sample_gamma(k, a)
其中
sample_gamma
來自 Gamma 分佈的樣本形成 Dirichlet 樣本。它運行良好,但對於某些 k/a 值,一些下游計算會下溢。
我對其進行了調整以使用日誌空間變量:
v = log(sample_gamma(k, a))
在調整了程序的所有其餘部分之後,它可以正常工作(至少它在測試用例上給了我相同的確切結果)。但是,它比以前慢了。
有沒有辦法直接採樣不使用慢速功能,例如? 我試過用谷歌搜索,但我什至不知道這個發行版是否有一個通用名稱(log-gamma?)。
考慮一個小的形狀參數 $ \alpha $ 接近 0,例如 $ \alpha = 1/100 $ . 在 0 到 $ \alpha $ , $ e^{-\alpha} $ 大約是 $ 1 $ , 所以 Gamma pdf 大約是 $ x^{\alpha-1}dx / \Gamma(\alpha) $ . 這可以集成到一個近似的 CDF, $ F_\alpha(x) = \frac{x^\alpha}{\alpha \Gamma(\alpha)} $ . 反轉它,我們看到一個 $ 1/\alpha $ 冪:一個巨大的指數。為了 $ \alpha = 1/100 $ 這會導致一些下溢的可能性(雙精度值小於 $ 10^{-300} $ , 或多或少)。這是下溢概率與以 10 為底的對數的函數關係圖 $ \alpha $ :
一種解決方案是利用這種近似來生成 log(Gamma) 變量:實際上,嘗試生成一個 Gamma 變量,如果它太小,則從這個近似的功率分佈生成它的對數(如下所示)。(重複執行此操作,直到日誌在下溢範圍內,以便它是原始下溢變量的有效替代。)對於 Dirichlet 計算,從每個日誌值中減去所有對數的最大值:這隱含地重新調整所有Gamma 會發生變化,因此不會影響 Dirichlet 值。將任何太小(例如,小於 -100)的結果日誌視為真零的對數。對其他日誌取冪。現在您可以繼續進行,而不會出現下溢。
這將需要比以前更長的時間,但至少它會起作用!
生成具有形狀參數的近似對數 Gamma 變量 $ \alpha $ , 預計算 $ C = \log(\Gamma(\alpha)) + \log(\alpha) $ . 這很容易,因為有算法可以直接計算 log Gamma 的值。生成一個介於 0 和 1 之間的均勻隨機浮點數,取其對數,除以 $ \alpha $ , 並添加 $ C $ 給它。
因為 scale 參數只是重新調整變量,所以在這些過程中容納它沒有問題。如果所有比例參數都相同,您甚至不需要它。
編輯
在另一個答復中,OP 描述了一種方法,其中 $ 1/\alpha $ 均勻變量的冪(a $ B(\alpha) $ 變量)乘以一個 $ \Gamma(\alpha+1) $ 變量。這是有效的,因為這兩個變量的聯合分佈的 pdf 等於 $ \left(\alpha x^{\alpha-1}\right) \left(y^{\alpha}e^{-y}dy/\Gamma(\alpha+1)\right) $ . 找到pdf $ z = xy $ 我們代替 $ y \to z/x $ , 除以雅各比 $ x $ , 並整合出 $ x $ . 積分的範圍必須從 $ z $ 到 $ \infty $ 因為 $ 0 \le y \le 1 $ , 從何而來
$$ \text{pdf}(z)=\frac{\alpha}{\Gamma(\alpha+1)}\int_z^{\infty}{\left(x^\alpha / x\right) e^{-x} (z/x)^{\alpha-1} dx} dz = \frac{1}{\Gamma(\alpha)}z^{\alpha-1}e^{-z}dz, $$
這是一個的pdf $ \Gamma(\alpha) $ 分配。
關鍵是當 $ 0 \lt \alpha \lt 1 $ , 一個取自的值 $ \Gamma(\alpha+1) $ 不太可能下溢並且通過將其對數和 $ 1/\alpha $ 乘以獨立統一變量的對數,我們將得到一個 $ \Gamma(\alpha) $ 變量。對數可能是非常負的,但我們將繞過其反對數的構造,這將在浮點表示中下溢。