> Figure 1: The Monte Carlo Simulation method is used in many industries, from the stock market to finance, energy, banking, and other forecasting models. | Source: Pexels
Python/ target=_blank class=infotextkey>Python 的蒙特卡羅仿真方法和應用程序的深入教程
作者:普拉蒂克·舒克拉,羅伯托·伊里翁多
什么是蒙特卡羅模擬?
蒙特卡羅方法是一種使用隨機數和概率來解決復雜問題的技術。Monte Carlo 模擬(或概率模擬)是一種用于了解金融部門、項目管理、成本和其他預測機器學習模型中風險和不確定性影響的技術。
風險分析是我們幾乎做出的每一個決策的一部分,因為我們不斷面對生活中的不確定性、模糊性和多變性。此外,盡管我們擁有前所未有的信息獲取機會,也無法準確預測未來。
蒙特卡羅模擬使我們能夠查看決策的所有可能結果并評估風險影響,從而在不確定性下做出更好的決策。
在這篇文章中,我們將通過五個不同的例子來了解蒙特卡羅模擬方法。
資源:谷歌科拉布實施 |Github
應用:
- · 金融
- · 能源
- · 制造
- · 工程
- · 研發
- · 保險
- · 石油和天然氣
- · 運輸
- · 環境
- · 其他
例子:
· 硬幣翻轉示例
· 使用圓和方形估算 PI
· 蒙蒂大廳問題
· 布馮投針的問題
· 為什么莊家總是贏
1. 硬幣翻轉示例:
公平硬幣的正面概率為1/2。然而,有什么辦法我們可以用實驗來證明嗎?在此示例中,我們將使用 Monte-Carlo 方法以 5000 次迭代方式模擬硬幣翻轉,以找出為什么正面或反面的概率始終為 1/2。如果我們重復這個硬幣翻轉很多,很多次,那么我們可以達到更高的精度,一個確切的答案,我們的概率值。
> Figure 2: Heads and tails, mathematical representation.
翻轉硬幣時:
> Figure 3: Formula for heads and tails coin example.
接下來,我們將用蒙特卡羅方法以實驗方式證明這個公式。
Python 實現:
· 導入所需的庫:
> Figure 4: Import the required libraries for our coin flipping example.
1. 硬幣翻轉功能:
> Figure 5: A simple function randomizing the results between 0 and 1, 0 for heads, and 1 for tails.
2. 檢查函數的輸出:
> Figure 6: Running the function of coin_flip()
3. 主函數:
> Figure 7: Calculating the probability and Appending the probability values to the results.
4. 調用主函數:
> Figure 8: Calling the Monte Carlo main function, along with plotting final values.
如圖 8 所示,我們顯示 5000 次迭代后,獲得反面的概率為 0.502。因此,我們如何使用蒙特卡羅模擬來實驗地找到概率。
2. 使用圓和正方形估算 PI:
> Figure 9: Simple area of a circle and of a square.
> Figure 10: Calculation of the area of a circle and square respectively.
為了估計 PI 的值,我們需要正方形的面積和圓的面積。要查找這些區域,我們將隨機在曲面上放置點,并計算落在圓內的點和位于正方形內的點。這將給我們估計他們的面積。因此,我們將使用點計數作為區域,而不是使用實際區域。
在下面的代碼中,我們使用 Python 的海龜模塊來查看點的隨機放置。
Python 實現:
1.導入所需的庫:
> Figure 10: Importing required libraries for our π example.
2.可視化作圖
> Figure 11: Drawing the figures.
3. 初始化一些必需的數據:
> Figure 12: Initializing data values.
4. 主函數:
> Figure 13: Implementing the main function.
5. 繪制數據:
> Figure 14: Plotting the data values.
6. 輸出:
> Figure 15: π approximations using the Monte Carlo methodology.
> Figure 16: Data visualization of the values.
> Figure 17: Data visualization of the values.
如圖 17 所示,我們可以看到,在 5000 次迭代之后,我們可以獲得 PI 的近似值。此外,請注意,隨著迭代次數的增加,估計誤差也呈指數級下降。
通過 Python 中的代碼示例,查看初學者的機器學習算法概述。
3. 蒙蒂大廳問題:
假設你在游戲表演,你可以選擇選擇三扇門之一:一扇門后面是一輛車;在其他門后面,山羊。你選一扇門,讓我們說門1,主人,誰知道門后面是什么,打開另一扇門,說門3,它有一只山羊。然后主人問你:你是要堅持自己的選擇還是選擇另一扇門?[1]
切換您選擇的門對您有利嗎?
根據概率,事實證明,切換門對我們有利。讓我們了解如何:
最初,對于所有三個門,獲得汽車的概率 (P) 是相同的 (P = 1/3)。
> Figure 18: A simulation of the three gates for our game show, showcasing each of the possible outcomes.
現在假設參賽者選擇門 1。接下來,主人打開第三扇門,它有一只山羊。接下來,主持人問參賽者是否想換門?
我們將了解為什么切換門更有利:
> Figure 19: A figurative outcome for the door gameshow.
在圖 19 中,我們可以看到主機打開車門 3 后,最后兩扇門有車的概率增加至 2/3。現在我們知道第三扇門有一只山羊,第二扇門有車的概率增加到2/3。因此,切換門更有利。
Python 實現:
1.導入所需的庫:
> Figure 20: Importing required libraries for our game show example.
2. 初始化某些數據:
> Figure 21: Initializing the doors and empty lists to store the probability values.
3. 主函數:
> Figure 22: Implementing the main function with a Monte Carlo Simulation method.
4. 調用主函數:
> Figure 23: Calling the main function of our game show example, and interesting 1000 times.
5. 輸出:
> Figure 24: Approximate winning probabilities to sticking with your choice or switching doors.
在圖 24 中,我們顯示 1000 次迭代后,如果我們切換門,獲勝概率為 0.669。因此,我們相信,在此示例中切換門對我們的優勢是管用。
4. 布馮投針的問題:
1777年[2][3],法國貴族喬治-路易斯·勒克萊克(Comte de Buffon)發布了以下問題。
假設我們把一根短針掉在有橫條的紙上——針頭躺在穿過其中一條線的位置的概率是多少?
概率取決于被統治紙張的線之間的距離 (d),它取決于我們掉落的針的長度 (l),或者更確切地說,它取決于比率 l/d。對于此示例,我們可以將針頭解釋為 l ≤ d。簡而言之,我們的目的是針不能同時穿過兩條不同的線。令人驚訝的是,布馮的針頭問題的答案涉及PI。
在這里,我們將使用布馮的針頭問題的解決方案,以實驗方式使用蒙特卡羅方法估計PI的價值。然而,在進入之前,我們將展示解決方案是如何派生的,使其更有趣。
定理:
如果將長度為 l 的短針掉到以相同距離 d ≥ l 的相等空間線裁定的紙張上,則針位于穿過其中一條線的位置的概率為:
> Figure 25: Buffon's needle problem theorem.
可視化投針問題
> Figure 26: Visualizing Buffon's needle problem.
接下來,我們需要計算穿過任何垂直線的針數。對于要與其中一條線相交的指針,對于 theta 的特定值,以下是針與垂直線相交的最大值和最小可能值。
1.最大可能值:
> Figure 27: Maximum possible value.
2. 最小可能值:
> Figure 28: Minimum possible value.
因此,對于 theta 的特定值,針位于垂直線上的概率為:
> Figure 29: Probability for a needle to lie on a vertical line formula.
上述概率公式僅限于一個值;在我們的實驗中,theta 的值范圍從0到pi/2。接下來,我們將通過集成它來查找實際概率,以結合所有 to 的值。
> Figure 30: Probability formula by integrating all possible values for theta.
> Figure 31: PI estimation.
使用布馮投針問題估算 PI:
接下來,我們將使用上述公式來實驗找出PI的值。
> Figure 32: Finding the value of PI.
現在,請注意,我們有 l 和 d 的值。我們的目標是首先找到 P 的值,以便獲得 PI 的值。要找到概率P,我們必須需要打針和總針的計數。由于我們已經有總針的計數,我們現在唯一需要的東西是打針的計數。
下面是我們如何計算命中針數的可視化表示。
> Figure 33: Visual representation to calculate the count of needles.
Python 實現:
1.導入所需的庫:
> Figure 34: Importing the required libraries for our problem.
3. 主函數:
> Figure 35: Implementing the Monte Carlo Simulation method to our Buffon problem.
3. 調用主函數:
> Figure 36: Calling the Monte Carlo Method's main function to our Buffon's problem.
4. 輸出:
> Figure 37: Data visualization of 100 iterations using the Monte Carlo Method.
> Source: 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美元去的會被莊家贏走。相比之下,輪盤賭的最低莊家邊緣為2.5%。因此,我們確信,你將有更好的機會贏得我們想象中的游戲輪盤賭。
Python 實現:
1.導入所需的庫:
> Figure 38: Importing the required libraries for our casino problem.
2.初始化
> Figure 39: Placing bets for odds and even numbers.
3. 主函數:
> Figure 40: Applying the Monte Carlo Methodology to our casino problem.
4. 最終輸出:
> Figure 41: Calculating and displaying the final values.
5. 運行 1000 次迭代:
> Figure 42: Running our function 1000 times.
6. 投注數量 = 5:
> Figure 43: Data visualization of results when the number of bets equals five.
7. 投注數量 = 10:
> Figure 44: Data visualization of results when the number of bets equals ten.
8. 投注數量 = 1000:
> Figure 45: Data visualization of results when the number of bets equals 1000.
9. 投注數量 = 5000:
> Figure 46: Data visualization of results when the number of bets equals 5000.
10. 投注數量 = 10000:
> Figure 47: Data visualization of results when the number of bets equals 10000.
從上面的實驗中,我們可以看到,如果玩家在這些游戲上下注較少,他們有更好的盈利機會。在某些情況下,我們得到負數,這意味著玩家失去了所有的錢和累積的債務,而不是盈利。
請記住,這些百分比是我們的模擬游戲,他們可以修改。
結論:
與任何預測模型一樣,仿真將只像我們估計得一樣好。重要的是要記住,蒙特卡羅模擬只代表概率,而不是確定性。然而,蒙特卡羅模擬可以是一個有價值的工具,當預測一個未知的未來。
詳細介紹我們的神經網絡教程,詳細介紹 Python 代碼和數學
免責聲明:本文所表達的觀點是作者的觀點,并不代表卡內基梅隆大學的觀點。這些著作并不打算成為最終產品,而是反映當前思維,同時成為討論和改進的催化劑。
引用:
[1] 概率問題報價, 21 電影, https://www.imdb.com/title/tt0478087/characters/nm0000228#quotes
[2] 喬治-路易斯·勒克萊克,布馮伯爵,維基百科,https://en.wikipedia.org/wiki/Georges-Louis_Leclerc,_Comte_de_Buffon
[3] 布馮投針問題,維基百科,https://en.wikipedia.org/wiki/Buffon%27s_needle_problem
(本文翻譯自Towards AI Team的文章《Monte Carlo Simulation An In-depth Tutorial with Python》,參考:https://medium.com/towards-artificial-intelligence/monte-carlo-simulation-an-in-depth-tutorial-with-python-bcf6eb7856c8)