原理:按照問題情景下的取樣方式,通過大量的隨機樣本,對系統進行模擬,從而求得所需計算的參量。
可以認為,蒙特卡洛方法粗略分為2類。第一類是所求解的問題本身具有內在的隨機性,借助計算機的運算能力可以直接模擬這種隨機的過程。這一類下,核物理研究中,分析中子在反應堆中的傳輸過程是乙個較為典型的例子。第二類則是所求解問題可以轉化為某種隨機分布的特徵數,比如通過投點法近似估算圓周率、近似計算定積分、隨機事件出現的概率,或者隨機變數的期望值。
本篇文章側重講解第二類情況。
import random
defmonte_carlo()
: n =
1000000
r =1.0 a, b =
(0.0
,0.0
) x_neg, x_pos = a - r, a + r
y_neg, y_pos = b - r, b + r
count =
0for i in
range(0
, n)
: x = random.uniform(x_neg, x_pos)
y = random.uniform(y_neg, y_pos)
if x*x + y*y <=
1.0:
count +=
1print
(count /
float
(n))
*4
最早的蒙特卡羅方法都是為了求解一些不太好求解的求和或者積分問題。
先從概率分布為均勻分布的簡單例子入手:
假定自變數x在[a,b]之間均勻分布,對於
用取樣(取樣的進行,後面會提到)的乙個值代表[a,b]區間上所有的f(x)的值,解法過於粗糙。那麼可以取樣[a,b]區間的n個值:x0,x1,…xn−1,用它們的均值來代表[a,b]區間上所有的f(x)的值,即:
但多數情況下,概率分布不是均勻分布的。
如果知道x在[a,b]區間的概率分布函式p(x),求和可以這樣進行:
這個形式就是蒙特卡羅方法的一般形式。(連續函式形式,但是在離散時一樣成立)。
代入均勻分布的條件,即
得到了x的概率分布函式p(x),便可以基於它去取樣同樣服從這個分布的含n個x的樣本集。如何進行取樣呢?
對於常見的均勻分布uniform(0,1),取樣樣本很容易。其實,其他常見的概率分布,無論是離散的分布還是連續的分布,它們的樣本都可以通過uniform(0,1)的樣本轉換而得。
對於概率分布不是常見的分布,乙個可行的辦法是採用接受-拒絕取樣來得到,或者說接近該分布的樣本。 如果p(x)十分複雜,那麼可以設定乙個程式可取樣的常見分布 q(x), 比如高斯分布,然後按照一定的方法拒絕某些樣本。
上圖的例子中,首先設定乙個高斯分布q(x)和常數k,使得 p(x) 總在 kq(x) 的下方。
接下來,對方便取樣的q(x),按前面提到方法進行取樣。然後,從均勻分布(0,kq(z0))中取樣得到乙個值u。如果未落在實際分布的區域中,則拒絕這次抽樣。重複以上過程得到n個接受的樣本:z0,z1,…zn−1,最終有
可見,設定乙個易取樣的分布 ,然後按照一定的方法拒絕某些樣本,以達到接近 實際概率分布p(x)分布的目的。
但是,接受-拒絕取樣也只能部分滿足我們的需求,在很多時候還是很難得到概率分布的樣本集,如一些稍特別的二維分布和高維非常見分布。
蒙特卡洛方法
蒙特卡洛方法 monte carlo method,也有翻譯成 蒙特卡羅方法 是以概率和統計的理論 方法為基礎的一種數值計算方法,將所求解的問題同一定的概率模型相聯絡,用計算機實現統計模擬或抽樣,以獲得問題的近似解,故又稱隨機抽樣法或統計試驗法。上述就是蒙特卡洛方法的基本概念,比較抽象,下面結合實際...
蒙特卡洛方法
這個演算法是用來求解積分和一些運算的,主要就是通過概率模擬的方法,比如對於 或者積分 import random def calpai n 1000000 r 1.0 a,b 0.0,0.0 x neg,x pos a r,a r y neg,y pos b r,b r count 0 for i ...
蒙特卡洛方法 蒙特卡洛方法概率密度函式
簡介 為了更加清楚的讓同學們深刻的理解pbr裡面那些公式背後的東西,同學們務必先來擼一遍光線追蹤,畢竟我們這裡舉例的這些蒙特卡洛方法都是光線追蹤第三卷裡 ray tracing the rest of your life 的舉例,只不過可能對於有的同學來說,閱讀起來比較難,所以我們來更加詳盡的翻譯或...