经典算法:蒙特卡洛方法(MCMC)
一、概念
蒙特卡羅方法(Monte Carlo method),也稱 統(tǒng)計模擬方法
蒙特卡洛方法的理論基礎(chǔ)是大數(shù)定律。大數(shù)定律是描述相當(dāng)多次數(shù)重復(fù)試驗的結(jié)果的定律,在大數(shù)定理的保證下:
利用事件發(fā)生的 頻率 作為事件發(fā)生的 概率 的近似值。
所以只要設(shè)計一個隨機(jī)試驗,使一個事件的概率與某未知數(shù)有關(guān),然后通過重復(fù)試驗,以頻率近似值表示概率,即可求得該未知數(shù)的近似值。
樣本數(shù)量越多,其平均就越趨近于真實值。
此種方法可以求解微分方程,求多重積分,求特征值等。
二、思考步驟
蒙特卡羅方法一般分為三個步驟,包括構(gòu)造隨機(jī)的概率的過程,從構(gòu)造隨機(jī)概率分布中抽樣,求解估計量。
1 構(gòu)造隨機(jī)的概率過程
對于本身就具有隨機(jī)性質(zhì)的問題,要正確描述和模擬這個概率過程。對于本來不是隨機(jī)性質(zhì)的確定性問題,比如計算定積分,就必須事先構(gòu)造一個人為的概率過程了。它的某些參數(shù)正好是所要求問題的解,即要將不具有隨機(jī)性質(zhì)的問題轉(zhuǎn)化為隨機(jī)性質(zhì)的問題。如本例中求圓周率的問題,是一個確定性的問題,需要事先構(gòu)造一個概率過程,將其轉(zhuǎn)化為隨機(jī)性問題,即豆子落在圓內(nèi)的概率,而π就是所要求的解。
2 從已知概率分布抽樣
由于各種概率模型都可以看作是由各種各樣的概率分布構(gòu)成的,因此產(chǎn)生已知概率分布的隨機(jī)變量,就成為實現(xiàn)蒙特卡羅方法模擬實驗的基本手段。如本例中采用的就是最簡單、最基本的(0,1)上的均勻分布,而隨機(jī)數(shù)是我們實現(xiàn)蒙特卡羅模擬的基本工具。
3 求解估計量
實現(xiàn)模擬實驗后,要確定一個隨機(jī)變量,作為所要求問題的解,即無偏估計。建立估計量,相當(dāng)于對實驗結(jié)果進(jìn)行考察,從而得到問題的解。如求出的近似π就認(rèn)為是一種無偏估計。
三、特點
一般情況下,蒙特卡羅算法的特點是,采樣越多,越近似最優(yōu)解,而永遠(yuǎn)不是最優(yōu)解。
優(yōu)點:對于具有統(tǒng)計性質(zhì)的問題可以直接進(jìn)行解決,對于連續(xù)性的問題也不必進(jìn)行離散化處理。
缺點:
1、對于確定性問題轉(zhuǎn)化成隨機(jī)性問題做的估值處理,喪失精確性,得到一個接近準(zhǔn)確的N值也不太容易。
2、如果解空間的可能情況很多則很難求解(NP問題)
與窮舉法的區(qū)別:
窮舉法是按某特定規(guī)則進(jìn)行搜索
蒙特卡洛方法則是隨機(jī)搜索
但是兩者都是屬于盲目搜索
四、舉例應(yīng)用
求圓周率。計算圓周率時可以考慮將一個單位圓放在一個正方形中,從而將求解圓周率轉(zhuǎn)化為計算出圓和正方形面積的比例。
蒙特卡羅方法的基本思想是這樣:假想你有一袋豆子,把豆子均勻地朝這個正方形上撒,然后數(shù)落在圓內(nèi)的豆子數(shù)占正方形內(nèi)豆子數(shù)的比例,即可計算出圓的面積,近而計算出π。而且當(dāng)豆子越小,撒的越多的時候,結(jié)果就越精確。
借助計算機(jī)程序可以生成大量均勻分布的坐標(biāo)點,接著統(tǒng)計出圖形內(nèi)的點數(shù),通過它們占總點數(shù)的比例和坐標(biāo)點生成范圍的面積就可以求出的近似值。
python代碼引用參考文獻(xiàn)1
import random import math import getopt import sys import matplotlib.pyplot as pltdef main():total = 0print('Start experiment: ')n = 0#Repeat try the estimate pi, until break it down manuallywhile True:n=int(input(sys.argv))for i in range(n):x = random.uniform(-1,1)y = random.uniform(-1,1)#x^2 + y^2 <=1, means (x, y) in the cycleif math.sqrt(x ** 2 + y ** 2) <= 1.0:total += 1plt.plot(x, y, 'ro')# x^2 + y^2 > 1, means (x, y) out of the cycleelse:plt.plot(x, y, 'b*')mypi = 4.0 * total / n#plot the x, y and close it after 5 secondsplt.ion()plt.pause(5)plt.close()print('Iteration Times = ', n, 'PI estimate value = ', mypi)print('math.pi = ', math.pi)print('Errors = ', abs(math.pi - mypi) / math.pi)參考文獻(xiàn)
1、蒙特卡羅算法-知乎
2、蒙特卡洛算法及其實現(xiàn)
總結(jié)
以上是生活随笔為你收集整理的经典算法:蒙特卡洛方法(MCMC)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle ldap 配置,ldap
- 下一篇: Hi3516E V200功能介绍