python求pai的近似值_PR Sampling Ⅰ: 蒙特卡洛采样、重要性采样及python实现
刘浚嘉:PR:机器人学的概率方法学习路径zhuanlan.zhihu.com
PR 采样分章 第一节:蒙特卡洛采样、重要性采样
引言
还记得我们之前学过的贝叶斯推断吗?
刘浚嘉:PR Ⅱ:贝叶斯估计/推断及其与MAP的区别zhuanlan.zhihu.com
贝叶斯推断要解决的不是如何估计参数,而是用来估计新测量数据出现的概率,对于新出现的数据
那么实际项目中,我们如何计算贝叶斯估计里这个积分呢?
- 基于采样的马尔可夫链蒙特卡罗 (Markov Chain Monte Carlo,简称MCMC)方法
- 基于近似的变分推断 (Variational Inference,简称VI)方法
本文主要介绍采样方法,其余的会在后续文章出现。
采样 —— 一种近似技术
当我们需要以较小的代价近似许多项的和或某个积分时,采样是一种很灵活且明智的选择。所以这不只是贝叶斯推断特有的方法,是一种普适性的积分近似技术。对于近似一个分布来说,从其中按概率分布采样来实现是一个非常自然的想法。
蒙特卡洛采样基础
简述Monto Carlo:
1. 蒙特卡洛方法Monte Carlo
可以通过采用随机投点法来求解不规则图形的面积。求解结果并不是一个精确值,而是一个近似值。当投点的数量越来越大时,该近似值也越接近真实值。
2. 蒙特卡洛方法也可以用于根据概率分布来随机采样的任务。
思路
把和或者积分视作某分布下的期望,然后通过估计对应的平均值来近似这个期望
或
这种思路就是加权求和,其权重为随机变量 x 的概率分布(求和时)或者概率密度函数(求积分时)。概率越高的地方,该变量被采样的几率越大,对应函数值的权重越大,故通过采样数据的经验平均可以近似整体的和或积分。
开始采样
我们根据
理论保障
- 上述经验平均值是 无偏 的,
;
- 根据 大数定律,若样本
是独立同分布的,其平均值几乎必然收敛到期望值,;
- 根据 中心极限定理,
的分布会收敛到以为均值、为方差的正态分布(只要有界,那么方差必然会趋于0。同时我们可以利用正态分布的累计函数来估计的置信区间。
问题
这种方法过于理想,所有结论依赖于我们可以从基准分布 p(x) 中轻易地采样,因为大部分时候 p(x) 都是未知的或者是形状诡异的分布 。一个直观的改进方法是:能不能通过某种变换,将概率分布函数转化成我们熟知的一些简单分布,这样我们从标准分布中采样即可得到 p(x) 中采样一样的结果。
重要性采样 Importance Sampling (IS)
在上一节我们理所当然的把 p(x) 当成概率分布,f(x) 视为被积函数。 p(x)f(x)当然不是唯一的分解方式啦,当从 p(x) 中采样不可行时,我们也可以构造一个分解:
这样我们就可以把更便于采样的 q(x) 视作采样概率,然后估计
学RL的同学应该很熟悉重要性采样,在off-policy的算法中用来处理产生动作的策略和学习策略不一致的问题。通过一个简单的可预测的分布去估计一个服从另一个分布的随机变量的均值。
在实际应用off-policy时,迭代过程通常会有两个策略:
- Behavior policy,用于生成学习过程所需要选择的动作,这一个简单的,探索性非常强的关于动作选择的分布;
- Target policy,这是我们最终希望得到的最优动作选择分布。
应用Importance Sampling可以通过Behavior policy估计Target policy可能反馈回来的收益的均值,即用一个简单分布去估计服从另一个分布的随机变量的均值。
Implementation
# 定义一个函数 f(x)
def f_x(x):return 1/(1 + np.exp(-x))# 定义两个分布 p(x), q(x)
def distribution(mu=0, sigma=1):# return probability given a valuedistribution = stats.norm(mu, sigma)return distribution# 采样点数
n = 1000 mu_target = 3.5
sigma_target = 1
mu_appro = 3
sigma_appro = 1p_x = distribution(mu_target, sigma_target)
q_x = distribution(mu_appro, sigma_appro)
# 从 p(x) 采样,这里为了图方便p(x)也设定成了正态分布,所以看起来采样很容易,对于非高斯还是很麻烦的
s = 0
for i in range(n):# draw a samplex_i = np.random.normal(mu_target, sigma_target)s += f_x(x_i)
print("simulate value", s/n) # 0.954# 从 q(x) 进行重要性采样
value_list = []
for i in range(n):# sample from different distributionx_i = np.random.normal(mu_appro, sigma_appro)value = f_x(x_i)*(p_x.pdf(x_i) / q_x.pdf(x_i))value_list.append(value)
# mean: 0.949, variance: 0.304
从构造出的近似分布采样得到的均值很接近原分布的采样期望,验证了重要性采样的理论。
这个q(x)难道就可以随意设定吗?我们试验一下,当两个分布dissimilar的时候:
# 采样点数
n = 5000mu_target = 3.5
sigma_target = 1
mu_appro = 1
sigma_appro = 1p_x = distribution(mu_target, sigma_target)
q_x = distribution(mu_appro, sigma_appro)
通过 q(x) 得到的均值为 0.995,方差为83.86。
方差过大的原因是,当两个分布过于不同时,p(x)/q(x)
的值会有巨大的差异,从而增加了方差。正如PRML中所述:
Hence a major drawback of the importance sampling method is the potential to produce results that are arbitrarily in error and with no diagnostic indication. This also highlights a key requirement for the sampling distribution
, namely that it should not be small or zero in regions wheremay be significant.
即,approximate distribution的大体趋势应该和desired distribution保持一致,不能出现差别很大的分布特性。
一个好的 q 分布的选择可以显著地提高蒙特卡罗估计的效率,而一个糟糕的 q 分布选择则会使效率更糟糕。一般的经验是 q(x)
定义在 p(x)|f(x)|
较大的地方,由此我们引出了最优采样函数的概念。
最优采样函数——方差最小
我们可以推导出最优的采样函数
,对于任意蒙特卡洛采样:
可以转化为重要性采样:
显然,估计的期望和采样分布 q 的选择无关,
方差想要最小,q 就应该满足:
Z 为归一化常数,选择适当的 Z 使得
一个好的采样函数,应该把更多的权重放在被积函数较大的地方。
观察上式,如果 f(x) 的符号一致,
,这意味着采样一个样本就足以得到原来的积分或和的值了。理论上确实是很美好,但这也意味着计算
有偏重要性采样
最优采样函数并不一定是适合采样的那个,只是方差最小的一个而已,其他能降低方差的 q 其实都可以。这种方法有一个优势,即不需要归一化的 p 或 q 分布。在处理离散变量时,有偏重要采样估计可以表示为
有偏是指
实际中,我们会倾向于将采样函数构造成常用的分布形式——高斯分布等,以方便采样。故有偏重要性采样更为常见。
延伸阅读
Importance Sampling for Keraswww.idiap.ch
在神经网络训练中,通过重要性采样来取代之前的uniform data sampling,从而加速训练收敛。
- Not All Samples Are Created Equal: Deep Learning with Importance Sampling (2018)
- Biased Importance Sampling for Deep Neural Network Training (2017)
Importance Sampling & Sequential Importance Sampling - Berkeleypeople.eecs.berkeley.edu
关联阅读
刘浚嘉:PR Sampling Ⅱ:马尔可夫链蒙特卡洛 MCMC及python实现zhuanlan.zhihu.com
刘浚嘉:PR Sampling Ⅲ: M-H and Gibbs 采样zhuanlan.zhihu.com
刘浚嘉:Reinforcement-Learning-in-Robotics 专栏目录zhuanlan.zhihu.com
更多系列文章见关联库
Reinforcement-Learning-in-Roboticsgithub.com
Reference
- Importance Sampling - Stanford
- Importance Sampling Introduction - Medium
python求pai的近似值_PR Sampling Ⅰ: 蒙特卡洛采样、重要性采样及python实现相关推荐
- python求pai的近似值_Python实现蒙特卡洛模拟(第1部分)【个人翻译自Medium】
- PRML第十一章读书笔记——Sampling Methods 拒绝采样/重要性采样/采样重要性重采样/数据增广IP算法、Metropolis算法/MH算法/吉布斯、切片采样、混合MC、估计配分函数
(终于把第十章读完了,这一章应该相对轻松.但这两天状态有待调整,所以没咋认真读) 目录 11.1 Basic Sampling Algorithms P526 标准概率分布 P528 拒绝采样 P53 ...
- python实现采样函数_PR Sampling Ⅰ: 蒙特卡洛采样、重要性采样及python实现
刘浚嘉:PR:机器人学的概率方法学习路径zhuanlan.zhihu.com PR 采样分章 第一节:蒙特卡洛采样.重要性采样 引言 还记得我们之前学过的贝叶斯推断吗?刘浚嘉:PR Ⅱ:贝叶斯估计/ ...
- 蒙特卡洛采样_PR Sampling : 蒙特卡洛采样、重要性采样及python实现
作者:刘浚嘉 专栏地址:https://www.zhihu.com/column/c_1188392852261134336 引言 还记得我们之前学过的贝叶斯推断吗?https://zhuanlan. ...
- 用Python求e的近似值
#计算e的值(精度为10**-6) sum,tmp = 1,1 for i in range(1,20):tmp*=isum += 1/tmpprint("e的近似值(精度为10**-6)为 ...
- 用python求pi的近似值_python求pi的方法
本文实例讲述了python求pi的方法,是一篇翻译自国外网站的文章,分享给大家供大家参考. 具体实现方法如下: #_*_ coding=utf-8 *_* ## {{{ http://code.act ...
- c语言编程求pai的近似值,c语言:求π的近似值
用公式π/4=1-1/3+1/5-1/7...求π的近似值,直到发现某一项的绝对值小于10^6为止(该项不累加) 解:程序: #include #include int main() { int si ...
- matlab求pai的近似值n取100,求π的近似值Matlab程序
求π的近似值Matlab程序 求π的近似值Matlab程序 #include #include int main() { int sign = 1; // sign用来表示数值的符号 double p ...
- python求列表最大值下标_切片,丝滑的字符串 | Python基础连载(三)
开篇 之前已经提到过,在Python中,一共有六大数据类型 本期就开始学习Python的六个标准数据类型中的字符串. 什么是字符串 在Python中,字符串是用一对引号(单引号/双引号均可)包裹起来的 ...
最新文章
- Linux12-bash变量和逻辑运行
- 【转】数据结构与算法(上)
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Mixin 混合进行方法注入 )
- centos7 安装配置openstack-dashboard (官网openstack-juno版)
- C#二维和多维数组编程实例
- cocos2d学习笔记2——学习资源
- 一份【软件工程】的学习指南已到达,请注意查收!!
- javascript消除字符串两边空格的两种方式,面向对象和函数式编程。python oop在调用时候的优点...
- 95-36-100-ChannelHandler-ChannelOutboundHandler
- android 高德地图 java.lang.UnsatisfiedLinkError: Native method not found: com.autonavi.amap.mapcore.MapC
- 概率论-多维随机变量及其分布思维导图
- 钢铁侠是如何练成的(一)
- 管理人员巡店用表-店长每日工作流程
- 交换机MAC地址表的形成过程动态演示
- VS Code 常用必备插件
- 超详细的Spring Boot教程,搞定面试官!
- 联想小新air15 2021 16G版魔改加装固态硬盘
- 用delphi编写医院的复杂报表
- Android——安卓卡片样式——CardView使用、CardView失效等
- 泛微OA 子表单中文本框设置默认值不显示的问题
热门文章
- ?????nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for pr
- git clone拉取太慢怎么办?
- 数据结构:堆和败者树的区别是什么?
- 【JavaScript】JS事件机制学习
- 【MyBatis】Mybatis实现分页效果
- 汇编语言 用加法计算123*236,结果存在ax中
- 15.profile-api
- 数据仓库与联机分析处理技术
- hdu 1116 欧拉路
- PostProcessor