Monte Carlo

Monte Carlo

概率论

XX:随机变量 (stochastic variables)

xx:观察XX的变量(observation of XX), 或者普通变量

f(x)f(x):变量xx的函数

p(x)p(x):随机变量xx的概率密度, 满足:

p(x)dx=1,p(x)0\int p(x)\mathrm{d}x=1,p(x)\geq 0

联合概率密度:

p(x,y)=p(x)p(y)p(x,y)=p(x)p(y)

条件概率密度:

p(yx)=p(x,y)p(x)p(y|x)=\frac{p(x,y)}{p(x)}

I^\hat{I}:结果II的估计器

E[X]XpE[X]_{X\sim p}:随机变量的期望, 满足:

E[X]Xp=xp(x)dxE[X]_{X\sim p}=\int xp(x)\mathrm{d}x

期望有很多性质:

  • 线性

E[aX+bX]=aE[X]+bE[X]E[aX+bX]=aE[X]+bE[X]

  • Law of the unconscious statistician

E[f(X)]Xp=f(x)p(x)dxE[f(X)]_{X\sim p}=\int f(x)p(x)\mathrm{d}x

  • Bernoulli大数定理

E[X]=limN(1Ni=0Nxi)E[X]=\lim_{N\to\infty}(\frac{1}{N}\sum_{i=0}^N x_i)

注意xix_i独立且同分布(independent and identically distributed)

方差是随机变量与其期望之间的二次偏差的期望(实际上是统计的内容, 不过就放这里吧):

S(X)=E[(XE[X])2]=E[X2]E[X]2S(X)=E[(X-E[X])^2]=E[X^2]-E[X]^2

不相关XX的线性组合的方差

S(NaX)=a2NS(X)S(\sum^NaX)=a^2\sum^NS(X)

Cumulative Distribution Function(CDF)

性质:

  • 与pdf关系

P(x)=xp(x)dxP(x)=\int_{-\infty}^x p(x)\mathrm{d}x

因此pdf是cdf的导数

p(x)=dP(x)dxp(x)=\frac{\mathrm{d}P(x)}{\mathrm{d}x}

abp(x)dx=P(b)P(a)\int_a^bp(x)\mathrm{d}x=P(b)-P(a)

  • 单调递增

  • 有界

蒙特卡洛法求解积分

如何直接求解定积分

回顾一下定积分


我们有个函数f(x)f(x), 我们想在aabb之间进行数值积分, 换句话数, 我们要计算曲线下的面积II, 也就是:

I=abf(x)dxI=\int_a^b f(x)\mathrm{d}x


如果把这块区域近似成矩形, 求它的面积非常好求

If(x)ΔxI\approx f(x)\Delta x


如果我们细分这块矩形, 它的结果将会更加精确

Ii=0Nf(xi)ΔxI\approx \sum_{i=0}^N f(x_i)\Delta x

细分数量是NN, 我们很容易得知每一块矩形的长是

Δx=baN\Delta x=\frac{b-a}{N}

因此, 细分还可以改写成

IbaNi=0Nf(xi)I\approx \frac{b-a}{N}\sum_{i=0}^N f(x_i)

如果我们对N取极限, 就是准确的积分结果

I=limNbaNi=0Nf(xi)I=\lim_{N\to\infty}\frac{b-a}{N}\sum_{i=0}^N f(x_i)

实际上这就是定积分的标准求解方法

如果我们把函数维度扩展到二维呢?

I=Df(x,y)dxdyI=\int_D f(x,y)\mathrm{d}x\mathrm{d}y

同样的步骤, 分割成小长方体, 计算体积, 细分

最后得到

I=limN,M(DNMi=0Nj=0Mf(xi,yj))I=\lim_{N\to\infty,M\to\infty}(\frac{D}{NM}\sum_{i=0}^N\sum_{j=0}^M f(x_i,y_j))

三维也是一样…扩展到N维, 都是可以工作的

但是, 等等!

由于不知道积分的解析解, 为了计算二维积分, 我们需要在二维上进行抽样, 复杂度是O(n2)O(n^2), 维度越高复杂度越高, 这几乎是一件不可接受的事情

想想渲染方程, 甚至有好多好多个维度

那如果我们减小精度, 让Δx\Delta x更大一些呢?


结果明显走样 (aliasing) 了, 计算结果完全错误, 采样频率太低了, (Nyquist frequency描述了准确采样需要的最低频率)

或许我们可以在采样前应用低通滤波器

但有更好的方法, 我们需要一个更好的积分估计器

Monte Carlo 估计器

啥是估计器 (Estimator) ?

总之, 我们先把公式变形一下, 让它看起来更好看一些

IbaNi=0Nf(xi)=1Ni=0N(ba)f(xi)\begin{align} I&\approx\frac{b-a}{N}\sum_{i=0}^N f(x_i)\\ &=\frac{1}{N}\sum_{i=0}^N(b-a)f(x_i) \end{align}


相同的采样数量, 唯一不同的是, 采样点是均匀随机分布在函数上

结果看起来好像有点正确了, 它的结果真的是正确的吗?

回顾一下概率论

我们在[a,b][a,b]范围内均匀采样, 那么随机变量的概率密度就是

p(x)=1bap(x)=\frac{1}{b-a}

因为

abp(x)dx=1\int_a^b p(x)\mathrm{d}x=1

把概率密度函数带入积分估计里面

I1Ni=0N(ba)f(xi)=1Ni=0Nf(xi)p(xi)\begin{align} I&\approx\frac{1}{N}\sum_{i=0}^N(b-a)f(x_i)\\ &=\frac{1}{N}\sum_{i=0}^N\frac{f(x_i)}{p(x_i)} \end{align}

xix_i服从分布XpX\sim p

回顾一下大数定理

E[X]=limN(1Ni=0Nxi)E[X]=\lim_{N\to\infty}(\frac{1}{N}\sum_{i=0}^N x_i)

大数定理和我们上面计算的式子是不是很像?

E[f(X)p(X)]=limN(1Ni=0Nf(xi)p(xi))E[\frac{f(X)}{p(X)}]=\lim_{N\to\infty}(\frac{1}{N}\sum_{i=0}^N\frac{f(x_i)}{p(x_i)})

再根据Law of the unconscious statistician

E[f(X)]Xp=f(x)p(x)dxE[f(X)]_{X\sim p}=\int f(x)p(x)\mathrm{d}x

我们把期望带进去

E[f(X)p(X)]=f(x)p(x)p(x)dx=f(x)dx=I\begin{align} E[\frac{f(X)}{p(X)}]&=\int\frac{f(x)}{p(x)}p(x)\mathrm{d}x \\ &=\int f(x)\mathrm{d}x \\ &=I \end{align}

这种方法就是蒙特卡洛法

甚至, p(x)p(x)可以是任意一种概率分布, 不一定要均匀分布!

等等, 如果p(x)p(x)是0呢? 虽然在公式里它被约去了

如果p(x)p(x)是0, 计算结果将会是错误的, 而且计算机除以0会产生NaN…

因此我们需要约定

p(x)>0,xDp(x)\gt 0, \forall x \in D

最终, 蒙特卡洛估计器的表达式是

I^=1Ni=0Nf(xi)p(xi)\hat{I}=\frac{1}{N}\sum_{i=0}^N\frac{f(x_i)}{p(x_i)}

Error

通常, 估计器都会有两种错误

  • 偏差 (Bias), E[I^]IE[\hat{I}]\not=I

  • 方差 (Variance)

蒙特卡洛估计器是无偏估计, 它没有偏差

计算一下蒙特卡洛估计器的方差

S(I^)=S(1NNf(X)p(X))=1N2NS(f(X)p(X))=1N2NS(f(X)p(X))=1NS(f(X)p(X))\begin{align} S(\hat{I})&=S(\frac{1}{N}\sum^N\frac{f(X)}{p(X)})\\ &=\frac{1}{N^2}\sum^NS(\frac{f(X)}{p(X)})\\ &=\frac{1}{N^2}NS(\frac{f(X)}{p(X)})\\ &=\frac{1}{N}S(\frac{f(X)}{p(X)}) \end{align}

方差与 N 成反比, 而且方差来源只有函数与概率函数的比值

因此蒙特卡洛估计器的偏差会随着采样数量增加而降低

那有没有快速降低方差的方法?

Importance Sampling


我们有个很大的f(x)f(x), 但只有个很小很小的p(x)p(x), 这意味着f比p的方差非常大

前面说过我们可以自由选择概率密度函数, 因此我们可以选择这个


可以看到选一个与f(x)f(x)几乎成比例的p(x)p(x)很重要

p(x)=sf(x)p(x)=sf(x)

定义一个常数s来缩放f(x)f(x)

由于p(x)p(x)在积分与上积分的值是1

因此

s=1f(x)dxs=\frac{1}{\int f(x)\mathrm{d}x}

应用这个缩放后

S(f(X)p(X))=S(f(X)sf(X))=S(1s)=0S(\frac{f(X)}{p(X)})=S(\frac{f(X)}{sf(X)})=S(\frac{1}{s})=0

方差是0! 完美!

但实践中这几乎不可能, 为了得到这样的概率密度, 我们需要的ss涉及到归一化f(x)f(x)

如果我们可以归一化f(x)f(x), 这意味着我们可以求解定积分, 这样应用蒙特卡洛就没有意义了

但我们还是有办法来逼近这样的概率密度

Inversion Method

假设输入的随机变量ξ\xi具有性质:

  • 连续

  • 均匀分布

  • 范围是[0,1)[0,1)

cdf一定是单调递增, 一个随机变量有且只有一个对应的概率, 这意味着cdf一般都具有反函数

这意味着, 给定一个概率, 我们可以用cdf的反函数直接找到它唯一对应的随机变量

Xi=Px1(ξ)X_i=P_x^{-1}(\xi)

更准确来说, 我们可以通过以下步骤从任意pdf中得到随机样本XiX_i

  • 计算cdf:P(x)=0xp(x)dxP(x)=\int_0^x p(x^{'})\mathrm{d}x^{'}

  • 计算cdf的反函数P1(x)P^{-1}(x)

  • 获取一个均匀分布的随机数ξ\xi

  • 计算Xi=P1(ξ)X_i=P^{-1}(\xi)

例子: 幂分布

给定指数分布的pdf:

p(x)=cxnp(x)=cx^n

cc是规范化pdf的常数, 我们需要先找出pdf的正确表达式

由于pdf积分一定等于1, 而且我们只输入[0,1)[0,1)的值, 因此可以写出:

01cxndx=1c1n+1xn+101=1cn+1=1c=n+1\begin{align} \int_0^1 cx^n\mathrm{d}x&=1\\ c\frac{1}{n+1}x^{n+1}\Big|_{0}^{1}&=1\\ \frac{c}{n+1}&=1\\ c&=n+1 \end{align}

因此p(x)=(n+1)xnp(x)=(n+1)x^n

现在, 我们可以计算它的cdf了:

P(x)=0xp(x)dx=0x(n+1)xndx=(n+1)0xxndx=xn+10x=xn+1\begin{align} P(x)&=\int_{0}^{x}p(x)\mathrm{d}x\\ &=\int_{0}^{x}(n+1)x^{n}\mathrm{d}x\\ &=(n+1)\int_{0}^{x}x^n\mathrm{d}x\\ &=x^{n+1}\Big|_{0}^{x}\\ &=x^{n+1} \end{align}

它的反函数是:

P1(x)=xn+1P^{-1}(x)=\sqrt[n+1]{x}

因此, 给定一个概率, 我们可以算出它的随机变量

X=ξn+1X=\sqrt[n+1]{\xi}

Inversion Method (2D)

二维的反演方法与一维有许多区别…

如果我们分别对两个pdf应用反演方法, 并输出结果, 结果是错误的

怎么样才能正确得到需要的二维分布?

例子: Unifom Disk

现在我们想在单位圆盘上均匀采样

但是如果我们在圆盘的外接矩形, 也就是单位矩形里均匀采样, 会有一些采样点落到圆盘外

如果使用内接矩形, 这些点又无法完全覆盖圆盘

我们知道除了直角坐标系, 有一种和圆关系密切的坐标系叫做极坐标系

由于是圆盘, 所以我们使用二维极坐标系

定义:

r[0,1)r\in[0,1)

θ[0,2π)\theta\in[0,2\pi)

与直角坐标系的转换

{x=rcosθy=rsinθ\left\{ \begin{align} x&=r\mathrm{cos}\theta\\ y&=r\mathrm{sin}\theta \end{align} \right.

是不是可以直接拿两个不相关的随机变量ξ\xi转换到rrθ\theta, 再转换到直角坐标系?

很遗憾, 结果是错的, 为什么?

我们知道圆盘的面积是πr2\pi r^2

如果我们把圆盘看作许多个宽为Δr\Delta r的同心圆环, 我们的方法实际上就是在所有同心圆环上应用相同数量的采样点

但是同心圆环的周长一直在边长, 那外围能应用的采样点就变少了

也就是说, 分布情况在沿着r的变化而变化

jj个圆环的半径等于rj=jΔrr_j=j\Delta r, 它包含了(rjr)2N(\frac{r_j}{r})^2 N个采样点

反过来, 第ii个采样点应该在圆环的位置是:ri=riNr_i=r\sqrt{\frac{i}{N}}

所以实际上ri=rξir_i=r\sqrt{\xi_i}

所以rr还要开个根号

是的, 这是正确的, 但这样直接针对图像来分析几乎是不可能的, 也不通用

我们需要一种更加通用的推导方法

错误如何发生

我们来分析一下之前我们为什么错了

左边是原始输入的二维随机变量, 右边成比例缩放[0,1]

右边网格最右边的矩形被压缩到原来的二分之一

右上角被压缩到原来的四分之一, 左下角放大了四倍

因此, 二维pdf实际上是一个无限小区域面积, 并且在变换pdf时被缩放到另一个区域里

这与我们变换圆盘时发现的现象一致

这种变换改变了我们的样本分布

如果我们知道是什么改变了分布, 我们就可以在蒙特卡洛里加权, 或者在变换后补偿

假设一个随机变量AA, 它在非线性双射转换(bijective transformation)变换后是BB, B=T(A)B=T(A)

非线性双射变换意味着b=T(a)b=T(a)随着aa单调递增或递减

这意味着每一个AiA_i都对应着唯一的BiB_i, 反之亦然

这种情况下, 两个随机变量的cdf满足PB(T(a))=PA(a)P_B(T(a))=P_A(a)

如果bb随着aa单调递增, 得到:

dPB(b)da=dPA(a)da\frac{\mathrm{d}P_B(b)}{\mathrm{d}a}=\frac{\mathrm{d}P_A(a)}{\mathrm{d}a}

如果bb随着aa单调递减, 得到:

dPB(b)da=dPA(a)da-\frac{\mathrm{d}P_B(b)}{\mathrm{d}a}=\frac{\mathrm{d}P_A(a)}{\mathrm{d}a}

根据pdf和cdf的性质, 我们知道pXp_XPXP_X的非负导数

dPX(x)dy=pX(x)dxdy\frac{\mathrm{d}P_X(x)}{\mathrm{d}y}=\frac{p_X(x)\mathrm{d}x}{\mathrm{d}y}

用这个性质重写单调递增的等式

dPB(b)da=dPA(a)dapB(b)dbda=pA(a)dadapB(b)dbda=pA(a)pB(b)=dbda1pA(a)\begin{align} \frac{\mathrm{d}P_B(b)}{\mathrm{d}a}&=\frac{\mathrm{d}P_A(a)}{\mathrm{d}a}\\ \frac{p_B(b)\mathrm{d}b}{\mathrm{d}a}&=\frac{p_A(a)\mathrm{d}a}{\mathrm{d}a}\\ p_B(b)\lvert\frac{\mathrm{d}b}{\mathrm{d}a}\rvert&=p_A(a)\\ p_B(b)&=\lvert\frac{\mathrm{d}b}{\mathrm{d}a}\rvert^{-1}p_A(a) \end{align}

当尝试把这个方法应用到单位圆盘,会发现它结果错了,不起作用,因为转换的不仅仅是一个变量的函数,而是两个

我们需要同时考虑到a和b两个变量的变化

解决方法

样本变化

将一组N个的值写为多维变量a\vec{a}, 将变换后的输出写为b\vec{b}

a=(a1an),b=(b1bn)=(T1(a)TN(a))=T(a)\vec{a}= \left( \begin{matrix} a_1\\ \vdots\\ a_n \end{matrix} \right) , \vec{b}= \left( \begin{matrix} b_1\\ \vdots\\ b_n \end{matrix} \right)= \left( \begin{matrix} T_1(\vec{a})\\ \vdots\\ T_N(\vec{a}) \end{matrix} \right)= T(\vec{a})

必须确保当一个多维变量转化为另一个时,包含联合pdf的全部变化

Jacobian矩阵包含我们可以用向量 a 和 b 形成的所有可能的偏导数的值

JT(a)=(b1a1b1aNbMa1bMaN)J_T(\vec{a})= \left( \begin{matrix} \frac{\partial b_1}{\partial a_1} & \cdots & \frac{\partial b_1}{\partial a_N}\\ \vdots & \ddots & \vdots\\ \frac{\partial b_M}{\partial a_1} & \cdots & \frac{\partial b_M}{\partial a_N} \end{matrix} \right)

因此,如果我们取第一行和第一列,则该元素表示向量 b 的第一个值如何随向量 a 中的第一个值变化

在第二行第一列中,我们看到向量 b 的第二个值如何随向量 a 中的第一个值变化,以此类推。

这意味着,对于任何给定的位置向量 a,我们可以将雅可比矩阵本身视为一个变换矩阵,它仅对位置向量 a 处的无限小区域有效

最后,Jacobian行列式描述了变换前后面积的变化。因此可以用行列式替换前面的范围变化项

(基本上完全没看懂,先看看怎么应用吧)

看看雅可比矩阵来描述转换到均匀圆盘的变化量

写成向量形式

(xy)=T(rθ)=(rcosθrsinθ)\left( \begin{matrix} x\\ y \end{matrix} \right) =T \left( \begin{matrix} r\\ \theta \end{matrix} \right) = \left( \begin{matrix} r\mathrm{cos}\theta\\ r\mathrm{sin}\theta \end{matrix} \right)

计算雅可比行列式

T(rθ)(rθ)=JT=(xrxθyryθ)=(cosθrsinθsinθrcosθ)=r\left| \begin{matrix} \frac{ \partial T \left( \begin{matrix} r\\ \theta \end{matrix} \right) }{\partial \left( \begin{matrix} r\\ \theta \end{matrix} \right) } \end{matrix} \right| = \left| J_T\right| = \left| \left( \begin{matrix} \frac{\partial x}{\partial r} & \frac{\partial x}{\partial\theta}\\ \frac{\partial y}{\partial r} & \frac{\partial y}{\partial\theta} \end{matrix} \right) \right| = \left| \left( \begin{matrix} \mathrm{cos}\theta & -r\mathrm{sin}\theta\\ \mathrm{sin}\theta & r\mathrm{cos}\theta \end{matrix} \right) \right| =r

替换掉变化量, 可以得到

p(x,y)=1rp(r,θ)p(x,y)=\frac{1}{r}p(r,\theta)

它告诉我们,直角坐标系中的均匀概率密度与极坐标系中的r成正比

正确采样联合概率密度函数

要正确转换二维分布,最后一个问题是正确采样联合概率密度函数

到目前为止,我们只讨论了不相关变量的转换

在有两个随机变量的情况下,给定它们的联合 PDF,我们可以这样做:我们首先计算一个变量的边缘密度函数,然后计算另一个变量的条件密度函数

我们将使用这些边际和条件密度函数,而不是单个变量的 PDF,因为只有在它们独立时才能保证有效

但是我们需要对它们执行的步骤是和之前一样的:对它们求积分,对不定积分求逆,并将它们用于采样

换句话说,我们要做的是:首先对一个随机变量进行抽样,然后对另一个进行抽样,因为第二个变量的抽样可能取决于第一个变量返回的结果

边缘概率密度是啥?举个例子,如果在 x 和 y 的所有可能组合中,我们有 50% 的机会看到 x=1,那么对于 x = 1,基于 p(x,y) 的 x 的边际密度将为 0.5

首先联合pdf的随机变量XXYY有范围[aX,bX)[a_X,b_X)[aY,bY)[a_Y,b_Y)

pX(x)p_X(x)看作p(x,y)p(x,y)xx点时,yy可能取值的平均密度

我们可以通过整合所有其他函数来获得其中一个的边际密度函数,例如

pX(x)=aYbYp(x,y)dyp_X(x)=\int_{a_Y}^{b_Y}p(x,y)\mathrm{d}y

接着,相对于x,y的条件概率密度是

p(yx)=p(x,y)pX(x)p(y|x)=\frac{p(x,y)}{p_X(x)}

例子:Unifom Disk 正式解决方案

再来一遍,这次我们用最好的方法来推导分布变换

我们知道采样域的总面积为π\pi,并且我们知道pdf必须在采样域上积分为1,因此我们知道任何一个点的联合概率密度应该是1pi\frac{1}{pi}

p(x,y)=1πp(x,y)=\frac{1}{\pi}

从之前计算的jacobian行列式我们知道了,分布转换时会有个大小为r的系数

p(r,θ)=rp(x,y)p(r,\theta)=rp(x,y)

因此,我们希望

p(r,θ)=rπp(r,\theta)=\frac{r}{\pi}

最后,我们计算r的边缘概率密度

pR(r)=02πp(r,θ)dθ=02πrπdθ=rπ02πdθ=rπ(2π0)=2r\begin{align} p_R(r)&=\int_{0}^{2\pi}p(r,\theta)\mathrm{d}\theta\\ &=\int_{0}^{2\pi}\frac{r}{\pi}\mathrm{d}\theta\\ &=\frac{r}{\pi}\int_{0}^{2\pi}\mathrm{d}\theta\\ &=\frac{r}{\pi}(2\pi-0)\\ &=2r \end{align}

在r条件下,θ\theta的条件概率密度是

p(θr)=p(r,θ)pR(r)=12πp(\theta|r)=\frac{p(r,\theta)}{p_R(r)}=\frac{1}{2\pi}

对边缘概率密度和条件概率密度分别应用Inversion Method

r[0,1]r\in[0,1]

因此积分上下限是0到1

P(r)=01pR(r)dr=012rdr=r2\begin{align} P(r)&=\int_{0}^{1}p_R(r)\mathrm{d}r\\ &=\int_{0}^{1}2r\mathrm{d}r\\ &=r^2 \end{align}

反函数

P1(r)=rP^{-1}(r)=\sqrt{r}

同理,θ\theta的定义域是

θ[0,2π]\theta\in[0,2\pi]

对条件概率密度积分

P(θ)=02πp(θr)dθ=02π12πdθ=12π(2π0)=1\begin{align} P(\theta)&=\int_{0}^{2\pi}p(\theta|r)\mathrm{d}\theta\\ &=\int_{0}^{2\pi}\frac{1}{2\pi}\mathrm{d}\theta\\ &=\frac{1}{2\pi}(2\pi-0)\\ &=1 \end{align}

它是常数函数,这意味着直接转换分布也不会有问题

结论:

{r=PR1(ξ1)=ξ1θ=PΘ1(ξ2)=2πξ2\left\{ \begin{align} r&=P_R^{-1}(\xi_1)=\sqrt{\xi_1}\\ \theta&=P_{\Theta}^{-1}(\xi_2)=2\pi\xi_2 \end{align} \right.

例子:Unifom Hemisphere

假设所有点都落在半球表面,也就是球半径为1

x2+y2+z2=1\sqrt{x^2+y^2+z^2}=1

定义域

θ[0,2π),ϕ[0,2π)\theta\in[0,\frac{2}{\pi}), \phi\in[0,2\pi)

球面坐标系与直角坐标系转换:

{x=rsinθcosϕy=rsinθsinϕz=rcosθ\left\{ \begin{align} x&=r\mathrm{sin}\theta\mathrm{cos}\phi\\ y&=r\mathrm{sin}\theta\mathrm{sin}\phi\\ z&=r\mathrm{cos}\theta \end{align} \right.

雅可比行列式:

(xrxθxϕyryθyϕzrzθzϕ)=(sinθcosϕrcosθcosϕrsinθsinϕ sinθsinϕrcosθsinϕrsinθcosϕcosθrsinθ0)=r2sinθcos2θcos2ϕ+r2sin3θsin2ϕ+r2sinθcos2θsin2ϕ+r2sin3θcos2ϕ=r2sinθ(cos2θcos2ϕ+sin2θsin2ϕ+cos2θsin2ϕ+sin2θcos2ϕ)=r2sinθ(sin2θ(sin2ϕ+cos2ϕ)+cos2θ(sin2ϕ+cos2ϕ))=r2sinθ(sin2θ+cos2θ)=r2sinθ\begin{align} \left| \left( \begin{matrix} \frac{\partial x}{\partial r} & \frac{\partial x}{\partial\theta} & \frac{\partial x}{\partial\phi}\\ \frac{\partial y}{\partial r} & \frac{\partial y}{\partial\theta} & \frac{\partial y}{\partial\phi}\\ \frac{\partial z}{\partial r} & \frac{\partial z}{\partial\theta} & \frac{\partial z}{\partial\phi} \end{matrix} \right) \right| &= \left| \left( \begin{matrix} \mathrm{sin}\theta\mathrm{cos}\phi & r\mathrm{cos}\theta\mathrm{cos}\phi & -r\mathrm{sin}\theta\mathrm{sin}\phi\\\ \mathrm{sin}\theta\mathrm{sin}\phi & r\mathrm{cos}\theta\mathrm{sin}\phi & r\mathrm{sin}\theta\mathrm{cos}\phi\\ \mathrm{cos}\theta & -r\mathrm{sin}\theta & 0 \end{matrix} \right) \right| \\&= r^{2}\mathrm{sin}\theta\mathrm{cos}^2\theta\mathrm{cos}^2\phi+r^{2}\mathrm{sin}^{3}\theta\mathrm{sin}^{2}\phi+ r^{2}\mathrm{sin}\theta\mathrm{cos}^2\theta\mathrm{sin}^2\phi+r^{2}\mathrm{sin}^{3}\theta\mathrm{cos}^{2}\phi\\ &=r^{2}\mathrm{sin}\theta(\mathrm{cos}^2\theta\mathrm{cos}^2\phi+\mathrm{sin}^2\theta\mathrm{sin}^2\phi+ \mathrm{cos}^2\theta\mathrm{sin}^2\phi+\mathrm{sin}^2\theta\mathrm{cos}^2\phi)\\ &=r^{2}\mathrm{sin}\theta(\mathrm{sin}^{2}\theta(\mathrm{sin}^{2}\phi+\mathrm{cos}^{2}\phi)+\mathrm{cos}^{2}\theta(\mathrm{sin}^{2}\phi+\mathrm{cos}^{2}\phi))\\ &=r^{2}\mathrm{sin}\theta(\mathrm{sin}^{2}\theta+\mathrm{cos}^{2}\theta)\\ &=r^{2}\mathrm{sin}\theta \end{align}

因此,在球坐标系下,联合概率密度是

p(r,θ,ϕ)=r2sinθ2πp(r,\theta,\phi)=\frac{r^{2}\mathrm{sin}\theta}{2\pi}

因为我们假设是单位半球,因此rr永远为1

计算θ\theta边缘概率密度

pΘ(θ)=02πsinθ2πdϕ=sinθ2π(02πdϕ)=sinθ\begin{align} p_\Theta(\theta)&=\int_{0}^{2\pi}\frac{\mathrm{sin}\theta}{2\pi}\mathrm{d}\phi\\ &=\frac{\mathrm{sin}\theta}{2\pi}(\int_{0}^{2\pi}\mathrm{d}\phi)\\ &=\mathrm{sin}\theta \end{align}

计算θ\theta的cdf

PΘ(θ)=θsinθdθ=0θsinθdθ=cosθ0θ=1cosθ\begin{align} P_\Theta(\theta)&=\int_{-\infty}^{\theta}\mathrm{sin}\theta\mathrm{d}\theta\\ &=\int_{0}^{\theta}\mathrm{sin}\theta\mathrm{d}\theta\\ &=-\mathrm{cos}\theta\Big|_{0}^{\theta}\\ &=1-\mathrm{cos}\theta \end{align}

计算θ\theta的cdf的反函数

PΘ1(θ)=cos1(1ξ)P_\Theta^{-1}(\theta)=\mathrm{cos}^{-1}(1-\xi)

因为ξ[0,1)\xi\in[0,1),所以可以用ξ\xi替换掉1ξ1-\xi

计算对于θ\theta来说,ϕ\phi的条件概率密度是

pΦ(ϕθ)=p(θ,ϕ)pΘ(θ)=12π\begin{align} p_\Phi(\phi|\theta)&=\frac{p(\theta,\phi)}{p_\Theta(\theta)}\\ &=\frac{1}{2\pi} \end{align}

计算ϕ\phi的cdf

PΦ(ϕ)=0ϕ12πdϕ=ϕ2π\begin{align} P_\Phi(\phi)&=\int_{0}^{\phi}\frac{1}{2\pi}\mathrm{d}\phi\\ &=\frac{\phi}{2\pi} \end{align}

计算ϕ\phi的cdf的反函数

PΦ1(ϕ)=2πξP_\Phi^{-1}(\phi)=2\pi\xi

因此概率分布转换是

{θ=cos1ξ1ϕ=2πξ2\left\{ \begin{align} \theta&=\mathrm{cos}^{-1}\xi_{1}\\ \phi&=2\pi\xi_{2} \end{align} \right.

又因为

cosθ=ξ1\mathrm{cos}\theta=\xi_1

而且众所周知,

sin2θ+cos2θ=1\mathrm{sin}^{2}\theta+\mathrm{cos}^{2}\theta=1

所以

sinθ=1cos2θ=1ξ12\begin{align} \mathrm{sin}\theta&=\sqrt{1-\mathrm{cos}^2\theta}\\ &=\sqrt{1-\xi_1^2} \end{align}

带入直角坐标系转球面坐标系

{x=1ξ12cos(2πξ2)y=1ξ12sin(2πξ2)z=ξ1\left\{ \begin{align} x&=\sqrt{1-\xi_1^2}\mathrm{cos}(2\pi\xi_2)\\ y&=\sqrt{1-\xi_1^2}\mathrm{sin}(2\pi\xi_2)\\ z&=\xi_1 \end{align} \right.

例子:Diffuse BRDF

首先,让我们再再再回顾一下渲染方程里的反射部分

Ωfr(x,ωv)L(xω)cosθωdω\int_\Omega f_r(x,\omega\to v)L(x\gets\omega)\mathrm{cos}\theta_\omega\mathrm{d}\omega

假设现在BRDF是Lambertian,它实际上是个常数Rπ\frac{R}{\pi}

cosine项也是可知的,它取决于ω\omega

最麻烦的部分是光照部分L(xω)L(x\gets\omega),我们不知道间接光会从哪里来,这个参数甚至还是递归的

我们完全不知道有关LL的信息,那就只能假设光线会从四面八方均匀射入,令它等于常数kk

ΩRπkcosθωdω\int_\Omega \frac{R}{\pi}k\mathrm{cos}\theta_\omega\mathrm{d}\omega

这样,被积函数的形状仅取决于cosθω\mathrm{cos}\theta_\omega,给定pdf:

p(ω)=ccosθp(\omega)=c\mathrm{cos}\theta

首先计算pdf,由于采样点只会落到半球上,因此整个半球上的cdf是1

Ωp(ω)dω=1\int_\Omega p(\omega)\mathrm{d}\omega=1

众所周知,任意球面的微分面积是

dA=(rsinθdϕ)(rdθ)=r2(sinθdθdϕ)\mathrm{d}A=(r\mathrm{sin}\theta\mathrm{d}\phi)(r\mathrm{d}\theta)=r^2(\mathrm{sin}\theta\mathrm{d}\theta\mathrm{d}\phi)

众所周知,立体角与球面面积的转换是

Ω=Ar2\Omega=\frac{A}{r^2}

因此

dω=dAr2=sinθdθdϕ\mathrm{d}\omega=\frac{\mathrm{d}A}{r^2}=\mathrm{sin}\theta\mathrm{d}\theta\mathrm{d}\phi

带回去

Ωp(ω)dω=102π0π2ccosθsinθdθdϕ=1c02π0π212sin2θdθdϕ=112c02π(cos2θ0π2)dϕ=1c202πdϕ=1c=1π\begin{align} \int_\Omega p(\omega)\mathrm{d}\omega&=1\\ \int_{0}^{2\pi}\int_{0}^{\frac{\pi}{2}}c\mathrm{cos}\theta\mathrm{sin}\theta\mathrm{d}\theta\mathrm{d}\phi&=1\\ c\int_{0}^{2\pi}\int_{0}^{\frac{\pi}{2}}\frac{1}{2}\mathrm{sin}2\theta\mathrm{d}\theta\mathrm{d}\phi&=1\\ \frac{1}{2}c\int_{0}^{2\pi}(-\mathrm{cos}2\theta\Big|_{0}^{\frac{\pi}{2}})\mathrm{d}\phi&=1\\ \frac{c}{2}\int_{0}^{2\pi}\mathrm{d}\phi&=1\\ c=\frac{1}{\pi} \end{align}

我们之前算过了雅可比矩阵,这里就直接用了,而且我们依然假设是单位球,半径为1,联合概率密度是

p(θ,ϕ)=cosθsinθπp(\theta,\phi)=\frac{\mathrm{cos}\theta\mathrm{sin}\theta}{\pi}

计算θ\theta边缘概率密度

pΘ(θ)=02πcosθsinθπdϕ=cosθsinθπ2π=2sinθcosθ=sin2θ\begin{align} p_\Theta(\theta)&=\int_{0}^{2\pi}\frac{\mathrm{cos}\theta\mathrm{sin}\theta}{\pi}\mathrm{d}\phi\\ &=\frac{\mathrm{cos}\theta\mathrm{sin}\theta}{\pi}2\pi\\ &=2\mathrm{sin}\theta\mathrm{cos}\theta\\ &=\mathrm{sin}2\theta \end{align}

计算θ\theta边缘概率密度的cdf

PΘ(θ)=θsin2θdθ=0θsin2θdθ=0θ12sin2θd2θ=12(cos2θ0θ)=12(1cos2θ)=12(1(12sin2θ))=sin2θ\begin{align} P_\Theta(\theta)&=\int_{-\infty}^{\theta}\mathrm{sin}2\theta\mathrm{d}\theta\\ &=\int_{0}^{\theta}\mathrm{sin}2\theta\mathrm{d}\theta\\ &=\int_{0}^{\theta}\frac{1}{2}\mathrm{sin}2\theta\mathrm{d}2\theta\\ &=\frac{1}{2}(-\mathrm{cos}2\theta\Big|_{0}^{\theta})\\ &=\frac{1}{2}(1-\mathrm{cos}2\theta)\\ &=\frac{1}{2}(1-(1-2\mathrm{sin}^{2}\theta))\\ &=\mathrm{sin}^{2}\theta \end{align}

它的反函数是

PΘ1(θ)=sin1(ξ)P_{\Theta}^{-1}(\theta)=\mathrm{sin}^{-1}(\sqrt{\xi})

计算相对于θ\theta来说,ϕ\phi的条件概率密度

pΦ(ϕ)=p(θ,ϕ)pΘ(θ)=12π\begin{align} p_\Phi(\phi)&=\frac{p(\theta,\phi)}{p_\Theta(\theta)}\\ &=\frac{1}{2\pi} \end{align}

和上面一致,直接写结果了

PΦ1(ϕ)=2πξP_\Phi^{-1}(\phi)=2\pi\xi

概率分布转换

{θ=sin1(ξ)ϕ=2πξ2\left\{ \begin{align} \theta&=\mathrm{sin}^{-1}(\sqrt{\xi})\\ \phi&=2\pi\xi_{2} \end{align} \right.

又因为

sin2θ+cos2θ=1ξ1+cos2θ=1cosθ=1ξ1\begin{align} \mathrm{sin}^{2}\theta+\mathrm{cos}^{2}\theta&=1\\ \xi_1+\mathrm{cos}^{2}\theta&=1\\ \mathrm{cos}\theta=\sqrt{1-\xi_1} \end{align}

带入直角坐标系转球面坐标系

{x=ξ1cos(2πξ2)y=ξ1sin(2πξ2)z=1ξ1\left\{ \begin{align} x&=\sqrt{\xi_1}\mathrm{cos}(2\pi\xi_2)\\ y&=\sqrt{\xi_1}\mathrm{sin}(2\pi\xi_2)\\ z&=\sqrt{1-\xi_1} \end{align} \right.


Monte Carlo
https://ksgfk.github.io/2022/09/08/MonteCarlo/
作者
ksgfk
发布于
2022年9月8日
许可协议