蒙特卡洛模擬(Python)深入教程
- 2020 年 9 月 21 日
- AI
字幕組雙語原文:Python)深入教程”>蒙特卡洛模擬(Python)深入教程
英語原文:Monte Carlo Simulation An In-depth Tutorial with Python
什麼是蒙特卡羅模擬?
蒙特卡羅方法是一種使用隨機數和概率來解決複雜問題的技術。 蒙特卡羅模擬或概率模擬是一種技術,用於了解金融部門、項目管理、成本和其他預測機器學習模型中風險和不確定性的影響。
風險分析幾乎是我們做出的每一個決定的一部分,因為我們在生活中經常面臨不確定性、模糊性和變化無常。 此外,即使我們擁有前所未有的信息獲取渠道,我們也不能準確預測未來。
蒙特卡洛模擬使我們能夠看到決策的所有可能結果,並評估風險影響,從而在不確定的情況下更好地做出決策。
在本文中,我們將通過五個不同的例子來理解蒙特卡羅模擬方法。
資源: 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愛好者。歡迎與雷鋒字幕組一起,學習新知,分享成長。