蒙特卡洛方法到底有什麼用

2021-09-02 06:32:16 字數 3712 閱讀 6029

蒙特卡洛方法(monte carlo method,也有翻譯成「蒙特卡羅方法」)是以概率和統計的理論、方法為基礎的一種數值計算方法,將所求解的問題同一定的概率模型相聯絡,用計算機實現統計模擬或抽樣,以獲得問題的近似解,故又稱隨機抽樣法或統計試驗法。上述就是蒙特卡洛方法的基本概念,比較抽象,下面結合實際工作中的理解,談一談對蒙特卡洛方法的一些認識。

(1)首先,蒙特卡洛不是個人名,而是個地名,說明該方法與概率有著密切的關聯。

蒙特卡洛方法的提出者是大名鼎鼎的數學家馮·諾伊曼,搞計算機的不可能不知道他(計算機之父),馮·諾伊曼在20世紀40年代中期用馳名世界的賭城—摩納哥的蒙特卡洛來命名這種方法。(大家也別把蒙特卡洛當乙個城市,估計和北京的一條街差不了多少,因為摩納哥(不是非洲的摩洛哥)本身就是個袖珍國家,比我國澳門都小的多)。說明該方法與賭博中的隨機性、概率性有著天然而密切的聯絡。幾乎涉及到複雜的、與概率相關的數值計算的領域都有可能會用到。比如計算物理、經濟金融、統計學、機器學習等。

(2)蒙特卡洛沒有什麼高深的理論,它只是一種方法或者說策略。

蒙特卡洛方法並沒有什麼高深的理論支撐,如果一定要說有理論也就只有概率論或統計學中的大數定律了。蒙特卡洛的基本原理簡單描述是先大量模擬,然後計算乙個事件發生的次數,再通過這個發生次數除以總模擬次數,得到想要的結果。比如投3個骰子,計算3個骰子同時是6的概率,可以模擬投n次(隨機樣本數),統計同時是6出現的次數c,然後c除以n即是計算結果。

(3)蒙特卡洛方法可以應用在很多場合,但求的是近似解,在模擬樣本數越大的情況下,越接近與真實值,但樣本數增加會帶來計算量的大幅上公升。

蒙特卡洛方法不僅僅是算概率哦,再看乙個稍複雜點的例項:求函式y=x2在[0,2]區間的積分,即求如下圖所示的紅色區域的面積。當然直接用數學中的定積分公式算更簡單精確,這裡主要是舉例說明下蒙特卡洛方法的使用過程。

繪圖**如下:

import numpy as np

import matplotlib.pyplot as plt

x = np.linspace(0, 2, 1000)

y = x ** 2

plt.plot(x, y)

plt.fill_between(x, y, where=(y > 0), color='red', alpha=0.5)

plt.show()

該紅色區域在乙個2×4的正方形裡面。使用蒙特卡洛方法,隨機在這個正方形裡面產生大量隨機點(數量為n),計算有多少點(數量為count)落在紅色區域內(判斷條件為y2),count/n就是所要求的積分值,也即紅色區域的面積。

1.模擬1000個隨機點:

2.計算落在紅色區域的比重:

count = 0

for xy in points:

if xy[1] < xy[0] ** 2:

count += 1

print((count / n) * (2 * 4))

輸出結果:

2.832

這與精確值(2.666666)的差距只有6.2%,而對於更大規模的模擬,n=100萬,輸出結果為:2.66528,這與精確值的差距只有0.051975%(萬分之五)。可以看出,蒙特卡洛方法有一定的誤差,誤差的大小與模擬的樣本大小直接相關,模擬樣本越大,誤差越小,但計算量也會大幅上公升。

(4)對於簡單問題來說,蒙特卡洛是個「笨」辦法。但對許多問題來說,它往往是個有效,有時甚至是唯一可行的方法。

對於上面的簡單問題,蒙特卡洛方法就顯得有點「笨」了。直接用數值積分運算更簡單,更精確。

print(scipy.integrate.quad(lambda x: x ** 2, 0, 2)[0])

輸出結果:

2.666666666666667

但對於涉及不可解析函式或概率分布的模擬及計算,蒙特卡洛方法是個有效的方法。

我們都玩過套圈圈的遊戲,想過為什麼你總是套不上嗎?用蒙特卡洛方法來算一算。

1.設物品中心點座標為(0,0),物品半徑為5cm。

2.設投圈半徑8cm,投圈中心點圍繞物品中心點呈二維正態分佈,均值μ=0cm,標準差σ=20cm,模擬1000次投圈過程。

上圖中紅圈為物品,散點圖為模擬1000次投圈過程中,投圈中心點的位置散布。

3.計算1000次投圈過程中,投圈套住物品的佔比情況。

print(len([xy for xy in points if xy[0] ** 2 + xy[1] ** 2 < (8-5) ** 2]) / n)

輸出結果:0.014,即投1000次,有14次能夠套住物品,就是個小概率事件,知道你為什麼套不住了吧。

(5)蒙特卡洛方法本身不是優化方法,與遺傳演算法、粒子群等優化演算法有著本質的區別。

蒙特卡洛方法與遺傳演算法、粒子群演算法等智慧型優化演算法有相似之處,比如都屬於隨機近似方法,都不能保證得到最優解等,但它們也有著本質的差別。一是層次不一樣,蒙特卡洛只能稱之為方法,遺傳演算法等則屬於仿生智慧型演算法,比蒙特卡洛方法要複雜。二是應用領域不同,蒙特卡洛是一種模擬統計方法,如果問題可以描述成某種統計量的形式,那麼就可以用蒙特卡洛方法來解決;遺傳演算法等則適用於大規模的組合優化問題(選址問題、排班問題、管理排程、路線優化)等,以及複雜函式求最值、引數優化等。

蒙特卡洛方法

蒙特卡洛方法 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 ...

介面到底有什麼用

我們定義乙個介面 public inte ce ibark 再定義乙個類,繼承於ibark,並且必需實現其中的bark 方法 public class dog ibark public void bark 然後,宣告dog的乙個例項,並呼叫bark 方法 dog 旺財 new dog 旺財.bark...