
概率论背景
(1) 数学期望
设
A. 如果
随机变量
B. 如果
随机变量
(2) 方差标准差
设
黎曼和
在开始讲蒙特卡洛估计之前, 我们先来回顾下黎曼和, 这样可以和下面对比, 加深印象.
设我们现在想求解积分
当
黎曼和是一种简单有效的估计积分值的方法.
蒙特卡洛估计
蒙特卡洛估计(Monte Carlo Estimator)的原理很简单, 假设现在我们要求解一个一维的积分
概率密度
现在来验证下, 这种方式是正确的:
这种积分同样可以任意扩展到多维度的情况.
蒙特卡洛估计的采样次数
计算结果表明, 蒙特卡洛估计误差收敛的速度为
重要性采样
现在我们有了蒙特卡洛估计方法, 下一步就是确定随机变量
一种简单的方式是直接直接使
更好的方法使用重要性采样(importance sampling), 即使概率密度
重要性采样本身很好理解, 就是得到值更大的部分, 对结果影响也更大, 自然需要更多的采样. 这样我们把有限的采样次数合理地分配在每个区间上.
值得注意的是, 一个不好的概率密度函数反而会使得结果的误差增大.
有的时候, 需要积分的方程中可能包含多个需要积分的部分, 这时候就需要用到多重重要性采样(multiple importance sampling/MIS).
比如现在要求解
一个常用的权重函数为:
在上面有两个部分的情况下得:
分层采样
有了上面得部分, 我们已经得到得完整的蒙特卡洛估计的步骤, 可以开始进行求解问题了.
比如现在要采样10次, 就取
这时我们又遇到了一个问题, 那就是这样独立地随机, 产生的随机结果是不均匀的, 会使结果的误差增大.
一个好的随机过程是取一系列的采样序列, 采样序列是一个复杂深奥的话题, 我们这里仅仅介绍下最简单的分层采样(Stratified Sampling). 我计划在其他的文章中讲这个话题, 读者也可以参考这个文刀秋二:低差异序列(一)- 常见序列的定义及性质.
分层采样的原理就是采样的样本空间均匀分成n等份, 在每份中取一个采样点. 为了减少采样结果的走样, 在每份中采样时加上一点抖动. 下图是一个简单的示例, 可以看出, 分层采样的结果更加均匀.

实践:IBL漫反射贴图
游戏中常用一个cubemap来表示环境光照, 在求解物体表面的环境光漫反射时, 通常会将漫反射贴图预积分计算出来.
漫反射的方程为:
左边的部分是不会变化的, 提出来得到:
这样我们就可以把
现在我们尝试用两种方式来求解:
A. 黎曼和
将
其实这里也可以看成是蒙特卡洛估计:
B. 蒙特卡洛估计
我们这里按照余弦权重来采样, 使用分层采样分别将
已知
我写了一份对全景图求irradiance map的python实现的代码, 放在这里raphael10241024/monte_carlo_demo, 从结果上来看, 相同采样次数下, 蒙特卡洛估计要优于黎曼和估计.
蒙特卡洛积分的高级应用有很多, 但是基本原理都是基于这两篇文章所讲的内容. 这个系列先写到这里, 后面看情况再补充新的.