蒙特卡羅計算積分
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
通常情況下,我們不能解析地求解積分,必須借助其他方法,其中就包括蒙特卡羅積分。你可能還記得,函數(shù)的積分可以解釋為函數(shù)曲線下的面積。
蒙特卡羅積分的工作原理是在a和b之間的不同隨機點計算一個函數(shù),將矩形的面積相加,取和的平均值。隨著點數(shù)的增加,所得結(jié)果接近于積分的實際解。

蒙特卡羅積分用代數(shù)表示:

與其他數(shù)值方法相比,蒙特卡羅積分特別適合于計算奇數(shù)形狀的面積。

在上一節(jié)中,我們看到如何使用蒙特卡羅積分來確定后驗概率,當我們知道先驗和似然,但缺少規(guī)范化常數(shù)。
后驗概率是指貝葉斯公式中的一個特定項。

貝葉斯定理可以用來計算一個人在某一特定疾病的篩查測試中呈陽性的人實際上患有該病的概率。

如果我們已經(jīng)知道P(A),P(B)和P(B | A),但想知道P(A | B),我們就用這個公式。例如,假設(shè)我們正在檢測一種感染1%人口的罕見疾病。醫(yī)學專業(yè)人員已經(jīng)開發(fā)出一種高度敏感和特異的檢測方法,但還不夠完善。
99%的病人檢測呈陽性 99%的健康患者檢測為陰性
貝葉斯定理告訴我們:

假設(shè)我們有10000人,100人生病,9900人健康。此外,在給他們所有的測試后,我們會讓99個生病的人測試生病,但是99個健康的人也測試生病。因此,我們將得到以下概率。
「p(sick) = 0.01」
「p(not sick) = 1–0.01 = 0.99」
「p(+|sick) = 0.99」
「p(+|not sick) = 0.01」

在前面的例子中,我們假設(shè)一個人患病的先驗概率是一個已知的量,精確到0.001。
然而,在現(xiàn)實世界中,認為0.001的概率事實上如此精確是不合理的。一個給定的人患病的概率會因其年齡、性別、體重等而有很大差異。一般來說,我們對給定先驗概率的認識還遠遠不夠完善,因為它是從以前的樣本中得出的(這意味著不同的人群可能會對先驗概率給出不同的估計)。
在貝葉斯統(tǒng)計中,我們可以用先驗概率的分布來代替這個0.001的值,這個分布捕捉了我們關(guān)于其真實值的先驗不確定性。包含先驗概率分布最終產(chǎn)生的后驗概率也不再是單一數(shù)量;相反,后驗概率也變成了概率分布。這與傳統(tǒng)的觀點相反,后者假設(shè)參數(shù)是固定的量。
正如我們在Gibbs抽樣和Metropolis-Hasting的文章中看到的,蒙特卡洛方法可以用來計算歸一化常數(shù)未知時的后驗概率分布。
讓我們來探究一下為什么我們首先需要一個標準化常數(shù)。在概率論中,規(guī)范化常數(shù)是一個函數(shù)必須乘以的常數(shù),因此它的圖下面積為1。還是不清楚?讓我們看一個例子。
回想一下正態(tài)分布的函數(shù)可以寫成:

2*pi的平方根是歸一化常數(shù)。
讓我們來看看我們是如何確定它的。我們從以下函數(shù)開始(假設(shè)均值為0,方差為1):

如果我們能畫出一個曲線的話。

問題在于,如果我們?nèi)∏€下的面積,它不等于1,這要求它是一個概率密度函數(shù)。因此,我們將函數(shù)除以積分的結(jié)果(歸一化常數(shù))。

回到手頭的問題,即如何在沒有歸一化常數(shù)的情況下計算后驗概率……事實證明,對于連續(xù)樣本空間,規(guī)范化常數(shù)可以重寫為:

在這一點上,你應(yīng)該考慮蒙特卡羅積分!
讓我們看看如何通過在Python中執(zhí)行蒙特卡洛積分來確定后驗概率。我們從導入所需的庫開始,并設(shè)置隨機種子以確保結(jié)果是可重復的。
import os
import sys
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import scipy.stats as st
np.random.seed(42)
然后我們設(shè)置β分布和二項分布的參數(shù)值。
a, b = 10, 10
n = 100
h = 59
thetas = np.linspace(0, 1, 200)
概率密度函數(shù)的范圍從0到1。因此,我們可以簡化方程。

在代碼中,前面的等式寫如下:
prior = st.beta(a, b).pdf(thetas)
likelihood = st.binom(n, thetas).pmf(h)
post = prior * likelihood
post /= (post.sum() / len(thetas))
最后,我們將先驗、后驗和似然的概率密度函數(shù)可視化。
plt.figure(figsize=(12, 9))
plt.plot(thetas, prior, label='Prior', c='blue')
plt.plot(thetas, n*likelihood, label='Likelihood', c='green')
plt.plot(thetas, post, label='Posterior', c='red')
plt.xlim([0, 1])
plt.xlabel(r'$\theta$', fontsize=14)
plt.ylabel('PDF', fontsize=16)
plt.legend();

蒙特卡羅積分是求解積分的一種數(shù)值方法。它的工作原理是在隨機點對函數(shù)求值,求和所述值,然后計算它們的平均值。
原文鏈接:https://towardsdatascience.com/monte-carlo-integration-db86b8d7beb3
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

