概率论和蒙特卡洛积分
引用自:
GAMES101-現代計算機圖形學入門-閆令琪_嗶哩嗶哩_bilibili
概率論的介紹
離散隨機變量
?連續隨機變量與概率密度函數(PDF)
因為是連續的,所以它的期望是用積分計算的
從變量與分布與期望,到函數與自變量與分布與期望
這個期望怎么求?
只要是求期望,就是概率*值,然后累加,結束;套上圖里的那個EX的公式。
這一段,是為了干啥?計算蒙特卡洛積分的時候會用到的。
蒙特卡洛積分
它是做什么的?計算定積分的結果的。
在積分不好解,只需要一個最后數值結果的時候可以用。
彈幕:
【總結一下,用數值方法去算一個復雜定積分的近似值】
【蒙特卡洛積分:我承認我有賭的成分】
【這看起來和黎曼積分是一回事】
【非均勻采樣有 pdf 的時候就不是一回事了】
【所以和黎曼積分不一樣的是黎曼積分是從小到大所有的位置的值都加起來 而蒙特卡洛積分是隨機采樣的值平均?】
【采樣本身有概率隨機性】
?
?具體的方法:
隨便按一個概率密度去采樣
應用舉例:
按一個均勻的概率密度采樣:
?
?還有一些注意事項
在x上積分,就得在x上采樣——很直白,但是以后很有用
其它網站的相關內容
為什么是F/P?
在視頻里,關于上圖里的公式為什么要/p,彈幕進行了激烈的討論:
【為什么是隨機采樣,不是均勻采樣呢】
【你可以用不同的概率分布采樣,均勻還是正態分布都可以】
【這里是樣本均值收斂于期望,應該是中心極限而不是大數】
【沒搞懂為什么f(x)要除以p(x),除了就得出了啥】
【就是多次求面積,再平均一下】
【為什么fx除以px?算面積不是要乘嗎?】
【不是求面積和么,怎么變成除p(x)了】
【這里解釋一下MC estimator的除以p(x)的問題, 蒙特卡洛法求積分其實和蒲豐投針有些類似, 通過頻率來估算概率,基于大數定律, 這里除以p(x)是為了使得其數學期望等于所求積分】
【乘以(b-a)可以看做除以 1 / (b-a)。 而前面講過了隨隨機在曲線上采樣因此隨機到每個點的概率都是1 / (b-a)。 擴展到更一般的隨機情況則有 1 / pdf(x)。】
【根據nvidia的gpu gem3 chapter20:除以pdf是一種加權,因為高pdf區域中的一個樣本僅相當于均勻分布中的一小部分樣本】
【簡單理解就是p越大這里就會有越多這個fx值,那為了公平求平均時就要除以出現次數】
【當某個區間的p變為原來的k倍時,隨機變量出現在這個區間的概率也擴大k倍,因此相當于在這個區間內采樣次數擴大k倍,求平均就要除以k】
【f(x)/p(x)=f(x)x/p(x)x,因為p(x)x=1,所以有f(x)/p(x)=f(x)x】
【概率密度不平均,在有的地方大,采樣的結果除以概率密度,來消除這種不平均的影響】
【就是f(x)的平均值 。然后用概率密度去修正】
【直觀但不嚴謹的說,就是該點滿足采樣的百分之多少,最后把這些求平均就得到了總體的百分比】
【看不懂的去看ray tracing ?in one weekend ?第三本】
【pdf很小,那么這一樣本出現的概率也越小,不加權的話就會導致最后的結果偏向于pdf大的樣本而不是正確的估計值】
【并不是經驗得出的,從概率論上可以證明,沒有理解的可以翻一下概率統計的課本】
【因為要公平對待整個定義域上的數值,所以出現概率越大的值占得權重應該相對較小, 所以是除以】
【f(x)這個pdf 采樣通常認為比較困難,所以用另一個容易采樣的pdf p(x)做 reweighting,然后通過對p(x)采樣對積分進行估計】
【重要性采樣】
【設g(x) = f(x) / p(x), 求g(x)的期望就是f(x)在[a, b]上的積分,再用大數定律得到n趨于無窮收斂于期望】
【蒙特卡洛說 你要積分的結果 我給你蒙一個】
【蒙特卡洛積分 你們對那個公式求一下期望就會懂了】
那末,為什么?
按照彈幕的說法求期望試試吧!
參照這個鏈接:
看懂蒙特卡洛積分(二) 蒙特卡洛估計與重要性采樣 - 知乎 (zhihu.com)
寫了這些,我是小白,不會數學,所以也不知道寫的對不對。
?上面那個是倒推的,有順著推的嗎?
這個鏈接里:(61條消息) 從期望到蒙特卡洛再到抽樣(MCMC學習和梳理)_surtol的博客-CSDN博客_蒙特卡洛求期望
引用了一個證明的鏈接:
?蒙特卡洛積分法(一) - 閃之劍圣 - 博客園 (cnblogs.com)
我覺得大概是這樣寫的:
?至于,這寫的對不對?我是小白……
實際使用
import random import math count = 1000 sum = 0.0 pi = 3.14159265 for i in range(count):p = 1.0 / pi #這里按均勻分布來進行采樣,所以PDF是常數函數,區間面積為1,區間寬度為pi,所以PDF恒為1.0/pix = random.uniform(0.0, pi)sum += math.sin(x)/p sum /= count print ("蒙特卡洛積分下的數值解:",sum) print ("牛————萊公式下的解析解:",math.cos(0) - math.cos(pi))差不多吧……
總結
以上是生活随笔為你收集整理的概率论和蒙特卡洛积分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx设置防爬虫策略
- 下一篇: 小波变换学习