的近似了! 但是這種方法的計算量非常大,而且隨著維數的增長需要的計算量也會成倍上升,收斂速度也並不快。但是我要講的蒙特卡洛求積跟這個些許不一樣。
假如我想求 ,我們來用概率的語言表達一下它。 設隨機變量 ,即 上的均勻分布, 具有密度函數 。 那麼就有: ,這個公式是下面推導中非常重要的一環。 事實上,藉助這個公式,我們將求積分轉化為求某個隨機變量的數學期望 !
接下來我們就可以用統計學的手段來處理了。
問題二:如何近似求一個隨機變量的數學期望?通常情況下, 都是一個比較複雜的函數。我們想要近似求期望,只能用統計學的手段。
設隨機變量 ,一個常用的辦法是,如果我們找到 個隨機變量 的樣本 那麼 就是 一個好的近似!
容易知道,上式中的 服從 上的均勻分布。
所以我們的做法可以總結如下:
生成 個 上均勻分布的隨機數 。
計算函數值
積分 具有近似值
接下來看一個例子來驗證我們的結果:
, 用蒙特卡洛方法近似計算 ,我們知道真實值是 ,介於2.6到2.7之間 取
N = 1000 x = 2 * np.random.random(size=N) # [0, 2] 上的均勻分布 ans = 2 / N * np.sum(x ** 2) print(ans)
2.6431046604313226
目前看來效果還算不錯,但是問題就這樣結束了麼?
問題三:估計的誤差是多少?凡估計必有誤差
每一次採樣都可以得到一個估計值,我們多次採樣,得到多個估計值,畫出多個估計值的分布圖,從圖上就可以近似看出估計的誤差了。
record = [] # 記錄多次採樣的估計值 N = 1000 # 每次採樣取1000個點 for _ in range(1000): x = 2 * np.random.random(size=N) ans = 2 / N * np.sum(x ** 2) record.append(ans) plt.title('N=1000') sns.distplot(record); plt.show()
驚訝的觀察到:
把單次採樣點增加到2000個,直覺告訴我們,誤差會減小!
record = [] # 記錄多次採樣的估計值 N = 2000 # 每次採樣取2000個點 for _ in range(1000): x = 2 * np.random.random(size=N) ans = 2 / N * np.sum(x ** 2) record.append(ans) plt.title('N=2000') sns.distplot(record); plt.show()
明顯看到分布更加緊湊了一些。
問題四:如何從理論上對蒙特卡洛估計做分析?在統計學上,我們評價一個估計好不好的標準有哪些呢?統計量有三大基本性質:
無偏性表示這個估計有沒有 bias;有效性指這個估計的方差夠不夠小;相合性或者說一致性,說的是當樣本容量非常大的時候,估計值是否趨近於真實值。
接下來我們從理論上來討論這三點: 設 是 的一個估計量,則:
是無偏的,這點很好理解,對於樣本 , 。
是相合估計量,根據大數定律,估計量 幾乎絕對收斂與 。
有效性沒法說明,但是我們可以知道 的方差為 (樣本之間獨立) 通過中心極限定理,還可以知道,當樣本容量很大的時候, 漸進服從以 為均值, 為方差的正態分布。
最後,我想展示一下,本文所述的轉化為估計隨機變量期望的蒙特卡洛方法 與 傳統的往正方形內投點計算落在圓內的點個數來估計 值的方法的不同。
Image Nameplt.figure(figsize=(12, 4)) record = [] for _ in range(1000): x = np.random.random(size=(2, 200)) ans = 4 * np.mean(np.linalg.norm(x, axis=0) < 1) # 是否落在圓內 record.append(ans) plt.subplot(121) sns.distplot(record, kde=False) record = [] for _ in range(1000): x = np.random.random(size=200) ans = 4 * np.mean(np.sqrt(1 - x ** 2)) # y = sqrt(1 - x ^ 2) record.append(ans) plt.subplot(122) sns.distplot(record, kde=False); plt.show()
同樣是取了2000個點(做200次計算),統計1000次結果。左圖為傳統方法,右圖為本文所述轉化為求期望的方法。
明顯右邊的效果更好!
結論本文簡要介紹了蒙特卡洛方法求積分的思路,以及相應的理論推導。蒙特卡洛求積分的本質是利用隨機模擬估計一個隨機變量的期望 。理解好蒙特卡洛求積的思想有助於進一步學習MCMC方法。
進一步還可以思考: