2.4 分布之间的转换(Transforming between Distributions

在描述反演方法时,我们引入了一种通过以特定方式转换典型均匀随机变量来生成符合某种分布的样本的技术。在这里,我们将研究一个更一般的问题,即当我们使用函数 \( f \) 将来自任意分布的样本转换为某种其他分布时,结果是如何分布的。理解这种转换的影响是有用的,尽管在这里我们将重点关注它们如何使我们能够推导出多维采样算法。

假设我们有一个从某个 CDF 为 \( P(x) \) 的 PDF \( p(x) \) 中抽取的随机变量 \( X \) 。给定一个函数 \( f(x) \) ,其具有 \( y=f(x) \) ,如果我们计算 \( Y = f(X) \) ,我们希望找到新随机变量 \( Y \) 的分布。在这种情况下,函数 \( f(x) \) 必须满足一对一变换;如果多个 \( x \) 值映射到相同的 \( y \) 值,那么就不可能明确描述特定 \( y \) 值的概率密度。 \( f \) 是一对一的直接结果是其导数必须严格大于 0 或严格小于 0,这意味着对于给定的 \( x \) ,

\[ \Pr\{ Y \leq f(x) \} = \Pr\{ X \leq x \} \]

根据 CDF 的定义,方程(2.3),我们可以看出

\[ P_f(y) = P_f(f(x)) = P(x)
\]

这个 CDF 之间的关系直接导致了它们的 PDF 之间的关系。如果我们假设 \( f \) 的导数大于 0,进行微分得到

\[ p_f(y) \frac{\text{d}f}{\text{d}x} = p(x) \]

因此

\[ p_f(y) = \left( \frac{\text{d}f}{\text{d}x} \right)^{-1} p(x) \]

一般来说, \( f \) 的导数要么严格为正,要么严格为负,密度之间的关系是

\[ p_f(y) = \left| \frac{\text{d}f}{\text{d}x} \right|^{-1} p(x) \]

我们如何使用这个公式?假设在定义域 \( [0,1] \) 上的 \( p(x) = 2x \) ,并设 \( f(x) = \sin{x} \) 。随机变量 \( Y = f(X) \) 的 PDF 是什么?因为我们知道 \( \text{d}f/\text{d}x = \cos{x} \) ,

\[ p_f(y) = \frac{p(x)}{|\cos{x}|} = \frac{2x}{\cos{x}} = \frac{2\arcsin(y)}{\sqrt{1 - y^2}}
\]

这个过程可能看起来有些反常——通常我们有一些想要从中采样的 PDF,而不是给定变换。例如,我们可能有从某个 \( p(x) \) 中抽取的 \( X \),并希望从某个分布 \( p_f(y) \) 计算 \( Y \) 。我们应该使用什么变换?我们所需要的只是 CDF 相等,或者 \( P_f(y) = P(x) \) ,这立即给出了变换

\[ f(x) = P_f^{-1}(P(x))
\]

这是反演法的一个概括,因为如果 \( X \) 在 \( [0,1) \) 上均匀分布,那么 \( P(x) = x \) ,我们有与之前介绍的相同的过程。

2.4.1 多维中的变换(Transformation in Multiple Dimensions)、

在一般的 \( d \) 维情况下,类似的推导给出了不同密度之间的类比关系。我们在这里不展示推导;它遵循与一维情况相同的形式。假设我们有一个 \( d \) 维随机变量 \( X \) ,其密度函数为 \( p(x) \) 。现在设 \( Y=T(X) \) ,其中 \( T \) 是一个双射(bijection)。在这种情况下,密度之间的关系为

(2.21)

\[ p_T(y) = p_T(T(x)) = \frac{p(x)}{|J_T(x)|}
\]

其中 \( |J_T| \) 是 \( T \) 的雅可比矩阵(Jacobian matrix)的行列式的绝对值,

\[ \left( \begin{matrix} {\partial T_1 / \partial x_1}&{\cdots}&{\partial T_1 / \partial x_d} \\ {\vdots}&{\ddots}&{\vdots} \\ {\partial T_d / \partial x_1}&{\cdots}&{\partial T_d / \partial x_d} \\ \end{matrix} \right) \]

其中下标索引 \( T(x) \) 和 \( x \) 的维度。

对于方程(2.21)的二维示例,极坐标变换将笛卡尔坐标 \( (x,y) \) 与极半径和角度相关联,

\[ x = r \cos{\theta} \] \[ y = r \sin{\theta} \]

假设我们从某个密度 \( p(r,\theta) \) 中抽取样本。那么对应的密度 \( p(x,y) \) 是什么?该变换的雅可比行列式为

\[ J_T = \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) = \left( \begin {matrix} \cos{\theta} & -r\sin{\theta} \\ \sin{\theta} & r\cos{\theta} \\ \end {matrix} \right) \]

行列式为 \( r(\cos^2\theta + \sin^2\theta) = r \) 。所以, \( p(x,y) = p(r,\theta)/r \) 。当然,这与我们通常想要的相反——通常我们的采样策略是想从笛卡尔坐标系开始,将其转换为极坐标系。在这种情况下,我们将会有

(2.22)

\[ p(r,\theta) = rp(x,y)
\]

在三维空间中,给定方向的球坐标表示,方程([3.7](../3_Geometry_and_Transformations/3_8_Spherical_Geometry.md#equation-3-7),该变换的雅可比行列式为 \( |J_T| = r^2\sin{\theta} \) ,因此相应的密度函数为

(2.23)

\[ p(r,\theta,\phi) = r^2\sin\theta p(x,y,z)
\]

这种变换很重要,因为它帮助我们将方向表示为单位球面上的点 \( (x,y,z) \) 。

2.4.2 具有多维变换的采样(Sampling with Multidimensional Transformations)

假设我们有一个二维联合密度函数 \( p(x,y) \) ,我们希望从中抽取样本 \( (X,Y) \) 。如果这些密度是独立的,它们可以表示为一维密度的乘积

\[ p(x,y) = p_x(x)p_y(y)
\]

而随机变量 \( (X,Y) \) 可以通过独立地从 \( p_x \) 中抽样 \( X \) 和从 \( p_y \) 中抽样 \( Y \) 来找到。然而,许多有用的密度并不是可分离的,因此我们将介绍在一般情况下如何从多维分布中抽样的理论。

给定一个二维密度函数,边缘密度函数(marginal density function) \( p(x) \) 是通过“整合出(integrating out)”其中一个维度获得的:

(2.24)

\[ p(x) = \int p(x,y) \text{d}y
\]

这可以被视为仅针对 \( X \) 的密度函数。更准确地说,它是特定的 \( x \) 在 所有 可能的 \( y \) 值上的平均密度。

如果我们可以抽取一个样本 \( X \sim p(x) \) ,那么——使用方程(2.1)——我们可以看到,为了抽取 \( Y \) ,我们需要从条件概率密度 \( Y \sim p(y|x) \) 中抽样,该密度由以下公式给出:

\[ p(y|x) = \frac{p(x,y)}{\int p(x,y) \text{d}y}
\]

从高维分布中进行采样可以以类似的方式进行,整合出所有维度中除了一个维度的部分,采样那个维度,然后对剩余的条件分布应用相同的技术,该条件分布的维度减少了一维。

采样双线性函数(Sampling the Bilinear Function)

双线性函数

(2.25)

\[ f(x,y) = (1-x)(1-y)w_0 + x(1-y)w_1 + y(1-x)w_2 + xyw_3
\]

在 \( [0,1]^2 \) 的四个角点处的四个值 \( w_i \) 之间进行插值。( \( w_0 \) 位于 \( (0,0) \) , \( w_1 \) 位于 \( (1,0) \) , \( w_2 \) 位于 \( (0,1) \) , \( w_3 \) 位于 \( (1,1) \) 。)经过积分和归一化后,我们可以发现其概率密度函数(PDF)是

\[ p(x,y) = \frac{4f(x,y)}{w_0 + w_1 + w_2 + w_3}
\]

/** 采样内联函数(Sampling Inline Functions) */
Float BilinearPDF(Point2f p, pstd::span<const Float> w) {
    if (p.x < 0 || p.x > 1 || p.y < 0 || p.y > 1)
        return 0;
    if (w[0] + w[1] + w[2] + w[3] == 0)
        return 1;
    return 4 * ((1 - p[0]) * (1 - p[1]) * w[0] + p[0] * (1 - p[1]) * w[1] +
                (1 - p[0]) * p[1] * w[2] + p[0] * p[1] * w[3]) /
           (w[0] + w[1] + w[2] + w[3]);
}

该函数的两个维度并不是独立的,因此采样方法在采样结果条件分布之前先对边缘分布进行采样。

/** 采样内联函数(Sampling Inline Functions) */
Point2f SampleBilinear(Point2f u, pstd::span<const Float> w) {
    Point2f p;
    /** 对双线性边缘分布采样 y(Sample **y** for bilinear marginal distribution) */
    /** 对双线性条件分布采样 x(Sample **x** for bilinear conditional distribution) */
    return p;
}

我们可以选择 \( x \) 或 \( y \) 作为边缘分布。如果我们选择 \( y \) 并对 \( x \) 进行积分,我们发现

\[ \begin {align} p(y) = \int_{0}^{1} p(x,y) \text{d}x &= 2 \frac{(1-y)(w_0+w_1)+y(w_2+w_3)}{w_0+w_1+w_2+w_3} \\ &\propto (1-y)(w_0+w_1)+y(w_2+w_3) \end {align} \]

\( p(y) \) 在两个常数值之间执行线性插值,因此我们可以使用 SampleLinear() 从简化的比例函数中进行采样,因为它对相关的 PDF 进行了归一化。

/** 对双线性边缘分布采样 y(Sample **y** for bilinear marginal distribution) */
p.y = SampleLinear(u[1], w[0] + w[1], w[2] + w[3]);

应用方程(2.1),并再次消去公因子,我们得到

\[ p(x|y) = \frac{p(x,y)}{p(y)} \propto (1-x)[(1-y)w_0 + yw_2] + x[(1-y)w_1 + yw_3]
\]

可以在 \( x \) 中使用 SampleLinear() 进行采样。

/** 对双线性条件分布采样 x(Sample **x** for bilinear conditional distribution) */
p.x = SampleLinear(u[0], Lerp(p.y, w[0], w[2]), Lerp(p.y, w[1], w[3]));

由于双线性采样过程是基于两个一维线性采样操作的组合,因此可以通过反向应用这两个操作的逆来进行反演。

/** 采样内联函数(Sampling Inline Functions) */
Point2f InvertBilinearSample(Point2f p, pstd::span<const Float> w) {
    return {InvertLinearSample(p.x, Lerp(p.y, w[0], w[2]),
                               Lerp(p.y, w[1], w[3])),
            InvertLinearSample(p.y, w[0] + w[1], w[2] + w[3])};
}

请参见 A.5 节以获取更多多维采样算法的示例,包括在单位球体和半球上采样方向的技术、采样单位圆盘以及其他用于渲染的有用分布。