蒙特卡洛方法(Monte-Carlo Simulation)
目錄
布封投針問題(Buffon's needle problem)
蒙特卡洛方法(Monte-Carlo Simulation)
封投針問題(Buffon's needle problem)
問題:
1、取一張白紙,畫出間隔為的等距平行線。
2、取一根長度為的針,隨機地向畫有等距平行線的紙上擲次,觀察針與直線相交的次數,記為。
3、計算針與直線相交的概率。
這個概率值是,其中是圓周率。
證明:
上圖中,表示針的尾部與平行線的距離,,表示針與平行線的夾角,。由於針是隨機落到平行線內的,所以概率是均等的,即。要使得針與邊界相交,那麼就要滿足。那麼要求針與邊界相交的概率,就是在可行域內解進行積分,即:
Buffon投針問題,反映出了,相交次數與的關係,從而可以估算出,Buffon投針是首次從幾何角度來表達概率的,也是首次通過隨機試驗來處理一個確定性的數學問題。
蒙特卡洛方法(Monte-Carlo Simulation)
蒙特卡洛方法是一種以概率統計理論為指導的一類非常重要的數值計算方法。蒙特卡羅是摩納哥公國的一座城市(賭城)。Buffon投針就是蒙特卡洛方法的思想,但是Buffon是蒙特卡洛方法的起源。蒙特卡洛方法同樣可以通過隨機通過產生隨機數的方式來解決計算問題。比如估算和計算不規則圖形的面積。如果你覺得Buffon投針方法來估算比較複雜,那麼來看用另一種簡單的Monte-Carlo方法估算。
估算PI
給定一個邊長為的正方形,裡是一個內切的圓,我們知道正方形的面積是,而的面積。怎麼估算呢?向正方形內隨機拋點,最後計算落在圓弧內的點,計算概率然後再乘以,就是的估算值。如下圖所示。隨著丟擲的點數增加,的估計值越準確。
# -*- coding: utf-8 -*-
"""
Created on Sat Sep 1 11:07:51 2018
@author: abner_hg
"""
import random
import math
icount = 0
iter_num = 10000
x_axis = []
y_axis = []
for i in xrange(iter_num):
x = random.random()
y = random.random()
if math.sqrt(x**2 + y**2) <= 1:
icount += 1
print('Pi = ', float(4*icount)/float(iter_num))
估計不規則圖形的面積
隨機拋點估計
假設我們需要計算一個不規則圖形的面積,那麼圖形的不規則程度和分析性計算(比如積分)的複雜程度是成正比的。而採用蒙特卡羅方法是怎麼計算的呢?如下圖,假設我們不知道曲線的具體函式表示式或者難以求出具體的函式表示式,那麼我們該怎麼估算陰影部分的面積?首先可以取一個邊長為的正方形,然後你可以隨機地向正方形內,隨機拋一些點,計算落在陰影部分的個數,最後除以丟擲的總個數,得出的值再乘以,就是陰影部分的面積一個估算。丟擲的點數越多,估算越準確,這個就是蒙特卡洛思想。
取樣估計
假設我們知道函式表示式,我們知道求解陰影部分的面積,可以對函式直接進行積分。那麼如果,我們難以計算積分,該怎麼辦?隨機拋點的方法是可以的,但是有沒有其他的方法?如下圖,我們可以隨機地在上取一個點,用來代表所有的函式值,那麼積分值就可以認為是。
上圖的估算結果肯定是不準確的,因為從圖中來看,有很多函式值是大於的,那麼為了使得估算更精確,我們需要採集更多的點,如下圖,
以這些函式值的均值來表示所有的函式值,那麼對積分的估算,就變成了。這種方式估算貌似比上一種更靠譜些。但是存在一個問題,我們取函式值都是隨機取的,也就是在哪個地方採集樣本點的概率都是一樣的。假如我們的函式表示概率密度函式(probability density function,pdf),積分就變成了求其累積分佈函式(Cumulative Distribution Function,CDF)。那麼在上圖中附近的點,應該比附近的點更加密集,因為附近處的概率值比較大,而附近處的概率值比較小,因此我們不能簡單地隨機採集樣本。那麼求解上述積分的關鍵,就是如何採集樣本點。
樣本採集
如何採集樣本是蒙特卡洛方法的關鍵一步,在《LDA數學八卦》中,有這麼一段話:
統計模擬中有一個重要的問題就是給定一個概率分佈,我們如何在計算機中生成它的樣本。一般而言均勻分佈的樣本是相對容易生成的。通過線性同餘發生器可以生成偽隨機數,我們用確定性演算法生成[0,1]之間的偽隨機數後,這些序列的各種統計指標和均勻分佈的理論計算結果非常接近。這樣的偽隨機序列就有比較好的統計性質,可以被當成真實的隨機數使用。
我們常見的概率分佈,連續或者離散的情況,都可以基於的樣本生成。例如正態分佈,可以由Box-Muller變換得到。
定理:(Box-Muller變換)如果隨機變數,獨立且,則:
則獨立且服從標準正態分佈。
寫這麼多的目的就是想表達,很多常見的分佈,是可以基於均勻分佈來實現取樣。回到剛才的問題,我們的比較複雜,難以取樣,那麼該如何實現取樣?
拒絕取樣(reject sample)
接下來我們以概率分佈函式來講解,假如給定的函式的值域大於1,我們可以歸一化到之間,從而可以看成概率密度函式。假如是我們常見的可採集的概率密度函式,那麼是否存在一個永遠大於呢?答案是否定的,因為所有的概率之和要滿足1,故任意兩個概率密度函式一定有交點。如下圖,就是我們找到的一個概率密度函式。
拒絕取樣的步驟:
1、在上採集一個樣本點
2、計算接受率。
3、在均勻分佈上,隨機選擇一個。
4、如果那麼接受。
5、重複步驟。
解釋兩個問題,1、什麼是接受率。2、為什麼要在均勻分佈上選取一個來決定是否接受。
問題1:
如上圖所示,表示落在綠線以下的部分是可接受的,落在綠線和紅線之間的,是被拒絕的。那麼那個判斷的臨界點就是接受率,在數學上的表示就是。
問題2:
我們在上隨機採集了一個點,我們不知道它是在那個區域,我們憑直覺可以知道,如果兩個函式,越接近,那麼被接受的區域就越大(上圖紫線越長),也就是越大,如果兩個函式相聚越遠,那麼被拒絕的區域也就越大(上圖紅線越長),也就是越小。此時怎麼辦,不能而用拋硬幣的方法來決斷,太過草率,由於是一個屬於之間的一個值,我們可以用在均勻分佈上進行隨機生成一個數,如果大於就拒絕,如果小於就接受。當然,這種方式也存在誤判情況。但是如果你的與比較接近的話,被誤判的可能性就越小,但是隨著採集的樣本點的增加,被接受的樣本點的函式值,大體上會與保持一致。
拒絕取樣的缺點:
1、如果與相距比較遠,那麼被被拒絕的樣本點會很多,採集10000個有可能被拒絕掉8000個,即使相距較勁,也可能被拒絕掉,費了很大勁,才計算出來的結果,被拒絕了,費時費力!
2、如果我們的分佈是在高維上,與是很難確定的。
取樣的方法有很多,以後有時間會在這一塊寫個總結。
我們知道了如何取樣,就知道了樣本集,那麼我們就可以對計算問題利用隨機模擬的方式進行估算,這就是蒙特卡洛方法的思想。
參考:《LDA數學八卦》
相關文章
- SOLIDWORKS 2024 Flow SimulationSolid
- Standard Simulation in Madden 22
- CSC3050 Project 4: Cache SimulationProject
- SOLIDWORKS 2022 Simulation新功能介紹Solid
- SOLIDWORKS Simulation有哪些版本?如何選擇?Solid
- SOLIDWORKS Simulation:最佳化設計的利器Solid
- SOLIDWORKS 2023新增功能 - SIMULATION模擬驗證Solid
- SOLIDWORKS Simulation實體網格劃分技巧Solid
- SAP CRM Fiori Simulation Pipeline 設計介紹
- 蒙特卡洛模擬(1)————三門問題
- 蒙特卡洛積分——非均勻取樣
- 如何寫好Simulation證明(一): 語義安全
- 模擬經營類遊戲(Simulation Game)綜述遊戲GAM
- 結合貪心搜尋和蒙特卡洛隨機遊走的面向DBpedia的實體連結方法隨機
- POLIR-Society-Organization-Management:Transform Business Skills with Proven Simulation and Assessment TechnologyORMSSM
- 如何在 SOLIDWORKS Simulation 中查詢反作用力Solid
- SOLIDWORKS Flow Simulation軟體流體分析結果檢視Solid
- 為什麼SOLIDWORKS Flow Simulation是最好的熱分析工具Solid
- 解析Monte-Carlo演算法(基本原理,理論基礎,應用實踐)演算法
- 轉存——Quartus II FPGA程式模擬執行時出現錯誤“error occurred during modelsim simulation”的解決方法FPGAError
- Python運用蒙特卡洛演算法模擬植物生長Python演算法
- 蒙特卡洛——使用CDF反函式生成非均勻隨機數函式隨機
- 【AlphaGo】AlphaGo背後的力量:蒙特卡洛樹搜尋入門指南Go
- AlphaGo的制勝祕訣:蒙特卡洛樹搜尋初學者指南Go
- 蒙特卡洛模擬(3)————求解有約束的非線性規劃問題
- sgx模擬執行,不需要sgx硬體---sgx executed in simulation,No need to support hardware for SGX
- 醫療行業應用3DEXPERIENCE Works 和 Simulation後的5大收穫行業3D
- 強化學習之蒙特卡洛學習,時序差分學習理論與實戰強化學習
- 強化學習 3—— 使用蒙特卡洛取樣法(MC)解決無模型預測與控制問題強化學習模型
- 開啟MCMC(馬爾科夫蒙特卡洛)的黑盒子 - Pymc貝葉斯推理底層實現原理初探馬爾科夫
- 大模型+蒙特卡洛樹搜尋,一招讓LLaMa-3 8B奧數水平直逼GPT-4大模型GPT
- Java中parse方法,ValueOf方法,toString方法Java
- Java的方法靜態方法Java
- js includes方法 和 filter方法JSFilter
- 方法
- Java方法03:方法的過載Java
- Java System類,currentTimeMillis方法,arraycopy方法。Java
- [方法]需求挖掘採集的方法