[PBRT-V3]从MCMC的角度分析MLT

本文通过Python实例深入探讨了Metropolis-Hastings采样方法,并将其与直接重要性采样进行了比较,展示了采样点数目对采样结果的影响。

关于MLT,之前有过一篇博文:Q139:PBRT-V3,Metropolis Light Transport (MLT)(16.4章节)

为了更好地理解MLT,小编决定从MCMC的角度对该渲染算法分析一下。

关于MCMC,主要参考如下(感谢Eureka和刘建平Pinard写了这些文章)。
Eureka的博文:
马尔可夫链蒙特卡罗算法(MCMC)
刘建平Pinard的博文:
MCMC(一)蒙特卡罗方法
MCMC(二)马尔科夫链
MCMC(三)MCMC采样和M-H采样

关于MCMC的解析,请参考如上链接。
后文主要包含两部分:小编的MCMC阅读笔记、从MCMC的角度分析MLT

MCMC

这里写图片描述
这里写图片描述

Metropolis采样的结果真的满足“重要性采样”吗???

(实例内容是基于:https://zhuanlan.zhihu.com/p/37121528
实例:假设目标平稳分布是一个均值3,标准差2的正态分布,而选择的马尔可夫链状态转移矩阵 Q(i,j) 的条件转移概率是以 i 为均值,标准差1的正态分布在位置 j 的值。

python实现代码:

#-*- coding: UTF-8 -*-
from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt

def norm_dist_prob(theta):
    y = norm.pdf(theta, loc=3, scale=2)
    return y

T = 400
pi = [0 for i in range(T)]
sigma = 1
t = 0
while t < T-1:
    t = t + 1
    pi_star = norm.rvs(loc=pi[t - 1], scale=sigma, size=1, random_state=None)   #状态转移进行随机抽样
    alpha = min(1, (norm_dist_prob(pi_star[0]) / norm_dist_prob(pi[t - 1])))   #alpha值

    u = np.random.uniform(0, 1)
    if u < alpha:
        pi[t] = pi_star[0]
    else:
        pi[t] = pi[t - 1]


plt.xlim(-5, 11)
plt.ylim(-0.01, 0.3)

plt.scatter(pi, norm.pdf(pi, loc=3, scale=2),label='Target Distribution')
num_bins = 50
plt.hist(pi, num_bins, normed=1, facecolor='red', alpha=0.7,label='Samples Distribution')

plt.legend()
plt.show()

采样结果如下:
这里写图片描述

为了更好地体现出采样点的分布情况,引入“直方图”
这里写图片描述
注意:
1,不要将直方图和条形图搞混。可以参考一下:【Python-matplotlib】画直方图(hist)
2,不要将直方图和“细分,累加求积分”混淆。
每一个矩形的高度表示矩形宽度区间内采样点出现的频数或者频率
从上图可以看到:[1,2]、[3,5]区间内的采样点分布相对密集(矩形相对较高)。
采样点的分布情况貌似和目标分布的函数值并不是严格匹配(重要性采样的“重要性”体现得不够好),原因是:采样点个数太少。

下面是采样点个数分别是1600,6400和25600的情况。
这里写图片描述
这里写图片描述
这里写图片描述

从这些图可以看出:随着采样点数目的增加,采样点的分布情况和目标分布越来越接近(也就是,越来越体现“重要性采样”)。
再次提醒:不要将直方图和“细分,累加求积分”混淆。
每一个矩形的高度表示矩形宽度区间内采样点出现的频数或者频率

考虑到正态分布原本是没有必要使用Metropolis方法进行采样的,而是可以直接进行重要性采样。python中有现成的采样函数。
这里咱对比看一下“Metropolis采样”和“直接重要性采样”的效果。
直接重要性采样的python代码如下。

#-*- coding: UTF-8 -*-
from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt

pi_star = norm.rvs(loc=3, scale=2, size=25600, random_state=None)

plt.xlim(-5, 11)
plt.ylim(-0.01, 0.3)

plt.scatter(pi_star, norm.pdf(pi_star, loc=3, scale=2),label='Target Distribution')
num_bins = 50
plt.hist(pi_star, num_bins, normed=1, facecolor='red', alpha=0.7,label='Samples Distribution')

plt.legend()
plt.show()

后面是采样点个数分别是400,1600,6400和25600时“直接重要性采样”的情况。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
对比Metropolis采样和直接重要性采样的结果,可以看出:
当采样点个数不是足够大时,直接重要性采样的结果的结果要比Metropolis采样的结果要好。
所以,如果能够进行直接重要性采样,就直接采样吧。
这里顺便提一下,通过“反函数法”进行直接重要性采样的步骤如下:
这里写图片描述

MLT具体是怎么实现路径空间的Metropolis采样的呢?

这里写图片描述
这里写图片描述
这里写图片描述

### 关于 pbrt-v3 中 LESS 文件或样式相关内容 pbrt-v3 是一个专注于物理基础渲染的开源项目,其核心目标是实现高质量的光线追踪渲染效果。然而,在该项目中并未涉及前端开发中的 CSS 预处理器(如 LESS 或 SASS),因为这些工具主要用于网页设计和前端界面开发领域[^1]。 #### 1. pbrt-v3 的文件结构分析 pbrt-v3 主要由 C++ 编写而成,源码目录按照功能模块进行了划分。例如,`src/core` 存放核心算法逻辑,而 `src/integrators` 则定义了不同的光照积分器实现方式。如果尝试寻找与样式相关的文件,则需注意以下几点: - **LESS 文件用途**:LESS 是一种动态样式表语言,扩展了标准 CSS 功能,允许变量、嵌套规则等功能。这种技术通常用于 Web 开发环境下的 UI 设计。 - **pbrt-v3 不适用场景**:由于 pbrt-v3 并未提供图形化用户界面(GUI),也无需处理 HTML/CSS 渲染问题,因此不会存在任何 LESS 文件或其他类似的样式资源[^4]。 #### 2. 如果需要自定义可视化风格怎么办? 尽管官方版本不支持 GUI 和样式定制,但开发者可以借助第三方库来增强用户体验。以下是两种可能的方向: - 使用 Qt 创建跨平台桌面应用程序接口; - 将渲染结果导出至图像文件并通过外部框架展示出来。 对于上述需求之一——即通过 Qt 实现带样式的交互窗口——则确实需要用到一些类似于主题设置的概念。不过这属于二次开发范畴,并不在原始代码库范围内[^2]。 ```cpp // 示例:假设我们想基于 Qt 构建简单的查看器 #include <QApplication> #include <QWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.resize(800, 600); // 设置大小 window.setWindowTitle("Custom Styled Viewer"); // 添加标题 QString styleSheet = "background-color: #f0f0f0; color: black;"; window.setStyleSheet(styleSheet); window.show(); return app.exec(); } ``` 此片段展示了如何利用 stylesheet 属性改变控件外观属性。当然实际应用时还需要进一步集成到整个工作流当中去[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值