蒙特卡洛模擬(Python)深入教程

2020-12-05 雷鋒網

字幕組雙語原文:蒙特卡洛模擬(Python)深入教程

英語原文:Monte Carlo Simulation An In-depth Tutorial with Python

翻譯:大表哥、wiige

什麼是蒙特卡羅模擬?

蒙特卡羅方法是一種使用隨機數和概率來解決複雜問題的技術。 蒙特卡羅模擬或概率模擬是一種技術,用於了解金融部門、項目管理、成本和其他預測機器學習模型中風險和不確定性的影響。

風險分析幾乎是我們做出的每一個決定的一部分,因為我們在生活中經常面臨不確定性、模糊性和變化無常。 此外,即使我們擁有前所未有的信息獲取渠道,我們也不能準確預測未來。

蒙特卡洛模擬使我們能夠看到決策的所有可能結果,並評估風險影響,從而在不確定的情況下更好地做出決策。

在本文中,我們將通過五個不同的例子來理解蒙特卡羅模擬方法。

資源: Google Colab Implementation | GitHub Repository

應用領域:

金融項目管理能量製造業工程學研究和開發保險石油和天然氣公司交通環境還有其他舉例:

拋硬幣示例用圓和平方估計PI三門問題蒲豐投針問題為什麼賭場總是賺的?a. 拋硬幣示例:

拋硬幣中獎的概率是1/2。但是,我們有沒有辦法從實驗上證明這一點呢? 在這個例子中,我們將使用蒙特卡羅方法迭代地模擬拋硬幣5000次,以找出為什麼頭部或尾巴的概率總是1/2。如果我們重複拋硬幣很多很多次,那麼我們可以在概率值的準確答案上獲得更高的精確度。在這個例子中,我們將使用Monte-Carlo方法反覆模擬拋硬幣5000次,以找出頭部或尾部的概率始終是1/2的概率。

圖2:正面和反面,數學表示。

在拋硬幣時:

圖3:正面和反面硬幣的公式示例。

接下來,我們將用蒙特卡羅方法對這個公式進行實驗證明。

Python實現:

1.導入所需的庫:

圖4:為我們的拋硬幣示例導入所需的庫。

2.投幣功能:

圖5:一個簡單的函數,將結果隨機排列在0和1之間,頭部為0,尾部為1。

3.檢查函數輸出:

圖6:運行Coin_Flip()函數

4.主要功能:

圖7:計算概率並將概率值附加到結果。

5.調用main函數:

圖8:調用Monte Carlo主函數,並繪製最終值。

如圖8所示,我們顯示在5,000次迭代之後,獲得尾部的概率為0.502。 因此,這就是我們可以如何使用蒙特卡羅模擬來通過實驗找到概率的方法。

b.使用圓形和正方形估算PI:

圖9:圓形和正方形的簡單面積。

圖10:分別計算圓形和正方形的面積。

要估計PI的值,我們需要正方形的面積和圓的面積。 為了找到這些區域,我們將在表面上隨機放置點,並計算落在圓內的點和落在正方形內的點。 這將給我們一個估計的面積。 因此,我們將使用點數作為面積,而不是使用實際面積。

在下面的代碼中,我們使用Python的Turtle模塊來查看點的隨機放置。

python實現:

1.導入需要的庫

圖10:為我們的π示例導入所需的庫。

2.可視化這些點:

圖11:繪製圖形。

3.初始化部分必填數據:

圖12:初始化數據值。

4.主要功能:

圖13:實現主功能。

5.繪製數據:

圖14:繪製數據值。

6.輸出

圖15:使用蒙特卡羅方法的π近似。

圖16:值的數據可視化。

圖17:值的數據可視化。

如圖17所示,我們可以看到,經過5000次迭代後,我們可以得到PI的近似值。 另外,請注意,隨著迭代次數的增加,估計誤差也呈指數下降。

3. 三門問題:

假設你正在參加一個遊戲節目,你可以從三扇門中選擇一扇:一扇門後面是一輛汽車;另一扇門後面是山羊。 你選了一扇門,假設是1號門,主人,誰知道門後面有什麼,就打開另一扇門,比如說3號門,裡面有一隻山羊。 主人然後問你:你是堅持自己的選擇,還是選擇另一扇門?

選擇不同的門對你有好處嗎? 事實證明,從概率上說,打開門對我們有利。具體分析:最初,對於所有的三個門,得到車的概率(P)是相同的(P = 1/3)。

圖18:三個門的模擬,展示了每個可能的結果。

現在假設參賽者選擇了門1。接下來,主人打開第三扇門,裡面有一隻山羊。接下來,主持人問參賽者是否要換門?我們將看到為什麼轉換門更有利:

圖19:門的圖示結果。

在圖19中,我們可以看到在主人打開門3之後,擁有一輛車的最後兩個門的概率增加到2/3。現在我們知道第三扇門有一隻山羊,第二扇門有一輛車的概率增加到2/3。因此,換門更為有利。現在我們將使用蒙特卡羅方法來多次執行這個測試案例,並通過實驗的方式找出它的概率。

Python 實現:

1. Import所需庫:

圖20: 導入所需庫。

2. 初始化數據:

圖21: 初始化代表門的枚舉變量和存儲概率值的列表。

3. Main函數:

圖22: 用蒙特卡洛模擬來實現主函數。

4. 調用main函數:

圖23: 調用主函數模擬1000次博弈。

5. 輸出:

圖24: 得到堅持自己的選擇或換門的近似獲勝概率。

在圖24中,我們發現在1000次模擬後,如果我們換門,獲勝概率是0.669。因此,我們確信在本例中換門對我們更有利。

4. 蒲豐投針問題:

法國貴族Georges-Louis Leclerc,即蒲豐公爵在1777年提出了這樣一個問題[2] [3]:

若在一張繪有等距平行線的紙上隨意拋一根短針,求針和任意一條線相交的概率。

概率取決於方格紙的線間距(d),和針長度(l)——或者說,它取決於l/d的比值。在這個例子裡,我們可以認為針長度l≤d。簡而言之,我們假設了針不能同時相交於兩條不同的線。令人驚訝的是,蒲豐針問題的答案與PI相關。

這裡,我們將使用用蒙特卡洛法來解蒲豐投針問題,順便估計出PI的值。不過在此之前,我們要先展示一下解法是如何推導出來的,這樣會更有趣。

定理:

如果一根長為l的短針落在一張紙上,而紙上畫有距離d≥l的等距線,那麼針與任一條線相交的概率為:

圖25: 蒲豐投針定理。

證明:

圖26: 蒲豐投針問題的可視化。

首先,我們需要統計出與任意垂線相交的針的數量。若針與任意一條線相交,對於特定的θ值,針與垂線相交的最大和最小可能值為:

最大可能值:

圖27: 最大概率值。

最小可能值:

圖28: 最小可能值。

因此, 對於特定的θ值,針在垂線上的概率是:

圖29: 針與垂線相交的概率公式。

這個概率公式局限於特定θ值,在本實驗中,θ的範圍是0到pi/2。所以,我們需要對所有的θ值做一個積分,得到投針相交的實際概率。

圖 30: 對所有θ值積分的投針相交概率公式。

圖 31: PI的估計值。

由蒲豐投針問題來估計PI:

接下來,我們要用上面的公式來進行實驗求得PI值。

圖 32: 求PI值。

現在,因為我們已經知道了l和d的值,所以只要求得了P的值,我們就可以推知PI的值。而要得到概率P,必須要知道相交針數和總針數, 這裡的總針數是已知的。

下圖是計算相交針數的直觀圖解。

圖33: 可視化表示如何計算針的數量。

Python 實現:

Import 所需的庫:

圖34: 導入所需庫。

2. Main 函數:

圖35: 用蒙特卡洛方法模擬蒲豐投針。

3. 調用main函數:

圖36: 調用main函數模擬蒲豐投針。

4. 輸出:

圖 37: 使用蒙特卡洛方法模擬100次投針的數據。

如圖37所示,經過100次的模擬,蒙特卡洛法就能得出一個非常接近PI的值。

圖源: Pexels

5. 為什麼賭場總是賺的?

賭場是怎麼賺錢的? 訣竅很簡單--「你玩得越多,他們賺的就越多。」 讓我們通過一個簡單的蒙特卡羅模擬示例來看看這是如何工作的。

考慮一個假想的遊戲,玩家必須從一袋籌碼中選擇一個籌碼。

規則:

袋子裡有數字從1到100的籌碼。用戶可以押注於偶數或奇數籌碼。在這個遊戲中,10和11是特殊的數字。 如果我們賭偶數,那麼10就算奇數,如果我們賭賠率,那麼11就算偶數。如果我們賭偶數,我們得了10,那麼我們就輸了。如果我們賭的是奇數,我們得了11,那麼我們就輸了。如果我們以賠率下注,我們獲勝的概率為49/100。 獲勝的概率為51/100。 因此,對於一個奇數下注,彩池優勢為= 51 / 100–49 / 100 = 200/10000 = 0.02 = 2%

如果我們打賭偶數,則用戶獲勝的概率為49/100。 獲勝的概率為51/100。 因此,對於一個奇數下注,彩池優勢為= 51 / 100–49 / 100 = 200/10000 = 0.02 = 2%

綜上所述,每下注1美元,就會有0.02美元下注。 相比之下,輪盤上最低的單一0優勢是2.5%。 因此,我們可以肯定,與輪盤賭相比,您在假想的遊戲中獲勝的機會更大。

Python 實現:

Import所需的庫:

圖38: 導入賭場模擬所需的庫。

2. 玩家下注:

圖39: 在下注奇數或偶數。

3. Main 函數:

圖 40: 使用蒙特卡洛方法模擬賭場行為。

4. 最終輸出:

圖41: 計算並展示計算結果。

5. 模擬1000次試試:

圖 42: 模擬1000次。

6. 下注數 = 5:

圖43: 下注5次時的結果可視化。

7. 下注數 = 10:

圖44: 下注10次時的結果可視化。

8. 下注數 = 1000:

圖45: 下注1000次時的結果可視化。

9. 下注數 = 5000:

圖46: 下注5000次時的結果可視化。

10. 下注數 = 10000:

圖47: 下注10000次時的結果可視化。

從上面的實驗中,我們可以看到,如果玩家在賭博中下注較少,那麼有得賺的機會就比較大。有時候實驗會得到負數,這意味著玩家輸得傾家蕩產負債纍纍,而不是單車變路虎。

請注意, 這些比例源於為促進理解的非真實場景,認不賭為贏。

結論:

就像任何預測模型一樣 模擬結果只有我們的估計值才是好的 重要的是要記住,蒙特卡洛模擬只代表概率而不是確定性。儘管如此,在預測未知的未來時,蒙特卡洛模擬是一個有價值的工具。

聲明:本文所表達的觀點僅代表作者本人,不代表CMU的觀點。這些文字並非為最終成品,僅為當下思考記錄以促進學習和交流。

雷鋒字幕組是一個由AI愛好者組成的翻譯團隊,匯聚五五多位志願者的力量,分享最新的海外AI資訊,交流關於人工智慧技術領域的行業轉變與技術創新的見解。

團隊成員有大數據專家,算法工程師,圖像處理工程師,產品經理,產品運營,IT諮詢人,在校師生;志願者們來自IBM,AVL,Adobe,阿里,百度等知名企業,北大,清華,港大,中科院,南卡羅萊納大學,早稻田大學等海內外高校研究所。

如果,你也是位熱愛分享的AI愛好者。歡迎與雷鋒字幕組一起,學習新知,分享成長。

相關焦點

  • Python學習第130課——蒙特卡洛模擬隨機遊走
    【每天幾分鐘,從零入門python編程的世界!】之前我們用代碼實現了醉漢隨機遊走的過程。現在我們用蒙特卡洛模擬計算一下,醉漢在不同的條件下打車回家的概率。我們先定義幾個參數。how_many_simulations,表示我們模擬多少次醉漢遊走的過程。taking_a_taxi_counter,表示我們模擬醉漢遊走一定的次數後,統計打車回家的次數。注意:我們以後寫代碼要把程序中需要的參數都變量化,就是說要先聲明需要的變量,用變量保存需要的參數。
  • 蒙特卡洛模擬方法
    但是會用python去構思基本的東西出來。我希望此文可以記錄思想,整理筆記、知識,並將其中承載的價值傳播給他人。 在本文中您可以學習到以下幾點知識蒙特卡洛定積分算法原理講解(公式篇)python實現算法(代碼篇)蒙特卡洛算法起源       蒙特卡羅方法於20世紀40年代美國在第二次世界大戰中研製原子彈的「曼哈頓計劃」計劃的成員S.M.烏拉姆和J.馮·諾伊曼首先提出。
  • 什麼是蒙特卡洛模擬?
    蒙特卡洛方法正是以概率為基礎的方法,因為偶然性和隨機結果是建模技術的核心,就像輪盤賭,骰子和老虎機等遊戲一樣。蒙特卡洛方法(Monte Carlo method),也稱統計模擬方法,是二十世紀40年代中期由於科學技術的發展和電子計算機的發明,而提出的一種以概率統計理論為指導的數值計算方法。其使用隨機數(或更常見的偽隨機數)來解決很多計算問題的方法。
  • 【學習心得032】期權定價之蒙特卡洛模擬法
    期權定價的方法主要有蒙特卡洛模擬以及二叉樹的方法,我們首先介紹使用蒙特卡洛模擬的方法。
  • 蒙特卡洛模擬算法|公開課3
    本篇是「微慕課」公開課系列第3講——蒙特卡洛模擬算法蒙特卡洛(Monte Carlo)模擬方法是一種廣受好評的算法,
  • 蒙特卡洛模擬(Monte Carlo Simulation)
    一、介紹蒙特卡洛模擬是一種統計學方法,用來模擬大量的數據。
  • 蒙特卡洛模擬方法及應用案例
    是把概率現象作為研究對象的數值模擬方法。是按抽樣調查法求取統計值來推定未知特性量的計算方法。蒙特卡羅法作為一種計算方法,是由美國數學家烏拉姆與美籍匈牙利數學家馮·諾伊曼在20世紀40年代中葉,為研製核武器的需要而首先提出來的。蒙特卡羅是摩納哥的著名賭城,該法為表明其隨機抽樣的本質而命名,故適用於對離散系統進行計算仿真試驗。
  • 蒙特卡洛模擬算法的探討與應用
    附錄一  蒲豐投針實驗與蒙特卡洛算法的相關代碼1.%以P開頭為畫圖程序,具體詳見附錄  13.Pmyanov(n,myanov,is);  14.Pmyerr(n,myerr,is);  15.Prep(mypi_n);  16.is = 0;  17.Pmyanov(n,myanov,is);  18.Pmyerr(n,myerr,is);  ……附錄二  蒙特卡洛模擬結果方差分析的相關代碼匯總
  • 蒙特卡洛模擬的簡單例子
    蒙特卡洛模擬我們首先把旋輪線放在坐標系中:旋輪線的方程為:x=r*(θ-sinθ)y=r*(1-cosθ)旋輪線內切於一個矩形 隨機數是蒙特卡洛模擬的關鍵在TB上,用以下程序進行測試,只要K線根數足夠多,Pips最終將收斂至0.75。
  • 蒙特卡洛算法在程序化研究中簡單應用
    近年來,程序化交易發展愈來愈火爆,傳統的程序化研究一直致力於各種成熟指標的組合,如將MACD和均線指標結合起來,在各種期貨合約品種上應用,尋求最佳的歷史回測效果;另外還有投資者利用自己對盤面的獨特了解,建立個人自定義的指標;然而隨著市場越來越多地程序化研究越來越深入,程序化交易方法基本是從市場價格和成交持倉信息出發,通過數學計算,構建交易模型,這也是造成模型同質化的根本原因
  • 蒙特卡洛方法到底有什麼用?
    蒙特卡洛方法(Monte Carlo method,也有翻譯成「蒙特卡羅方法」)是以概率和統計的理論、方法為基礎的一種數值計算方法,將所求解的問題同一定的概率模型相聯繫,用計算機實現統計模擬或抽樣,以獲得問題的近似解,故又稱隨機抽樣法或統計試驗法。上述就是蒙特卡洛方法的基本概念,比較抽象,下面結合實際工作中的理解,談一談對蒙特卡洛方法的一些認識。
  • 大數據分析Python NumPy庫使用教程
    大數據分析Python NumPy庫使用教程為數據工程師提供有關NumPy的從零開始的培訓。這意味著您不需要具有NumPy的任何經驗,也不會浪費任何時間學習與數據工程工作無關的東西。 在瀏覽了基礎知識之後,您將快速開始使用NumPy來構建和操作二維和三維數組。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐
  • ...請收下這份2018學習清單:150個最好的機器學習,NLP和Python教程
    一般我會找一個有意思的教程或者視頻,再由此找到三四個,甚至更多的教程或者視頻。猛回頭,發現標收藏夾又多了20個資源待我學習(推薦提升效率工具Tab Bundler)。為了幫助也在經歷類似探索過程的童鞋,我把至今發現的最好的教程匯總了一個列表。當然這不是網絡上有關ML的最全集合,而且其中有一部分內容很普通。我的目標是要找到最好的有關機器學習子方向和NLP的教程。我引用了能簡潔介紹概念的基礎內容。
  • 乾貨 | 請收下這份2018學習清單:150個最好的機器學習,NLP和Python教程
    一般我會找一個有意思的教程或者視頻,再由此找到三四個,甚至更多的教程或者視頻。猛回頭,發現標收藏夾又多了20個資源待我學習(推薦提升效率工具Tab Bundler)。注意力模型與增強型遞歸神經網絡(distill.pub)http://distill.pub/2016/augmented-rnns/ 這麼不科學的遞歸神經網絡模型(karpathy.github.io)http://karpathy.github.io/2015/05/21/rnn-effectiveness/ 深入遞歸神經網絡模型
  • 如何自學成 Python 大神?這裡有些建議
    但是學習 Python 的初學者往往會面臨以下殘酷的現狀:網上充斥著大量的學習資源、書籍、視頻教程和博客,但是大部分都是講解基礎知識,不夠深入;也有的比較晦澀,難以理解。如果你真的想要高效地學習 Python,那就需要掌握如何過濾網上的垃圾教程資源的技能,並從其他有經驗的程式設計師或在線編程社區中獲得幫助。
  • 蒙特卡洛方法在美式期權定價中的應用
    蒙特卡洛方法是以概率和統計理論方法為基礎的一種計算方法,利用隨機數(實際應用中通常為偽隨機數)來產生隨機的基於一定分布假設的數字序列,進而解決各種計算問題。通過對問題的結果分布進行假設和擬合,利用電子計算機實現統計模擬或抽樣,以獲得問題的近似解。為象徵性地表明這一方法的概率統計特徵,故借用賭城蒙特卡洛命名。
  • 利用python進行蒙特卡羅模擬
    本文用Python統計模擬的方法,介紹四種常用的統計分布,包括離散分布:二項分布和泊松分布,以及連續分布:指數分布和正態分布,最後查看人群的身高和體重數據所符合的分布
  • 一文了解AlphaGo中蒙特卡洛方法的由來與發展
    然而,蒙特卡洛方法作為一種研究工具真正被使用,仍是源於第二次世界大戰中研製原子彈的研究,這項工作涉及了一項在核燃料中中子隨機擴散的概率問題的直接模擬,在這些調查的初期階段,馮·諾依曼和烏蘭精化了這個特殊的「俄羅斯輪盤賭」和「分裂」的方法,到1948年,針對薛丁格方程,費米、Metropolis和烏蘭採用蒙特卡洛方法估算出其特徵值,開始了蒙特卡洛方法的系統研究。
  • 無需數學知識:快速了解馬爾可夫鏈蒙特卡洛方法
    這裡再次強調,MCMC的全稱即為馬爾可夫鏈蒙特卡洛方法。為了理解其工作原理,我將首先介紹蒙特卡洛模擬,而後再討論馬爾可夫鏈概念。所謂蒙特卡洛模擬(Monte Carlo simulations),是指一種通過重複生成隨機數來估計固定參數的方法。通過生成隨機數並對其進行一些計算,蒙特卡洛模擬能夠為某一無法直接計算(或者直接計算成本過於高昂)的參數提供近似值。