关于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 pltdef norm_dist_prob(theta):y = norm.pdf(theta, loc=3, scale=2)return yT = 400
pi = [0 for i in range(T)]
sigma = 1
t = 0
while t < T-1:t = t + 1pi_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 pltpi_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]从MCMC的角度分析MLT相关推荐

  1. 从源码和内核角度分析redis和nginx以及java NIO可以支持多大的并发

    有人询问我网上一篇关于"redis为什么单线程这么快"的文章,我建议他不要看了,因为redis是单进程不是单线程,后面的意见不用看了,文章质量肯定不会很好,他也说了自己看了很久源码 ...

  2. Mybatis底层原理学习(二):从源码角度分析一次查询操作过程

    在阅读这篇文章之前,建议先阅读一下我之前写的两篇文章,对理解这篇文章很有帮助,特别是Mybatis新手: 写给mybatis小白的入门指南 mybatis底层原理学习(一):SqlSessionFac ...

  3. 带你从源码角度分析ViewGroup中事件分发流程

    序言 这篇博文不是对事件分发机制全面的介绍,只是从源码的角度分析ACTION_DOWN.ACTION_MOVE.ACTION_UP事件在ViewGroup中的分发逻辑,了解各个事件在ViewGroup ...

  4. 【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )

    文章目录 一.问题描述 二.从编译器角度分析该问题 三.数组作为参数的推荐方案 一.问题描述 将 数组 作为 函数参数 , 传递时会 退化为指针 ; 数组的首地址 , 变为指针地址 , 函数中无法判定 ...

  5. 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | 从封装的数据结构角度分析 EventBus )

    文章目录 EventBus 中的重要数据类型 1.subscriptionsByEventType 集合 2.typesBySubscriber 集合 EventBus 中的重要数据类型 从几个关键的 ...

  6. 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  7. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  8. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  9. 从程序员的角度分析微信小程序

     从程序员的角度分析微信小程序             我赶快在书架上拿出三年前买的书,把上面的土擦干净,压压惊. 作为一个并不是资深的程序员. 从程序员的角度分析一下微信小程序,欢迎指点. 首先 ...

最新文章

  1. anaconda下配置R子环境并配置jupyter notebook的R Kernel
  2. KNN算法(K最近邻算法)详解
  3. 设置sql*plus的sqlprompt
  4. wpf加载obj格式的3D模型图解
  5. 效率达CPU一万倍、内含800万神经元:英特尔发布神经形态芯片超算
  6. inodesusedpercent_Linux运维监控基础采集项
  7. 提高CSS文件可维护性的五种方法
  8. ReactOS,硬件抽象层,HAL概述
  9. 爬虫-演练-GET请求抓取网页的内容
  10. tf.keras.layers.Attention 理解总结
  11. 买了小区一楼的感受是怎样的?
  12. 【腾讯云的1001种玩法】 Laravel 整合微视频上传管理能力,轻松打造视频App后台...
  13. Android 手势放大图片
  14. WAP技术入门(下)(转)
  15. Ubuntu安装和常用软件
  16. 一台阿里云ECS下的CIDI方案 最具性价比的简化DevOps自动化部署方案
  17. 图像处理 图像识别 模式识别 分类检测
  18. 安装算量软件免费吗?鹏业安装算量(在线版):更简单、更高效
  19. java 随机字母_如何用java随机生成一个字母
  20. 【无标题】java核心资料

热门文章

  1. SpringBoot入门 2
  2. django migration使用指南
  3. char* str = abc ;跟char str[] = abc;的区别
  4. 【贪心 和 DP + 卖股票】LeetCode 122. Best Time to Buy and Sell Stock II
  5. 关于sinX与y的大小比较取值范围计算
  6. TCP握手协议的巧计方法
  7. python 导入其他目录下的模块
  8. latex 版本控制:TexStudio/Texmaker/... + git(smartGit)
  9. continue跳转
  10. 关于html中对换行的处理