Monte Carlo Approximations
准备总结几篇关于 Markov Chain Monte Carlo 的笔记。
本系列笔记主要译自A Gentle Introduction to Markov Chain Monte Carlo (MCMC) 文章下给出的链接。
Monte Carlo Approximations
Monte Carlo Approximation for Integration
理论部分
本文主要参考 Monte Carlo Approximations
蒙特卡洛方法是用来近似计算积分的,通过数值方法也可以计算积分:最简单的近似方法是通过求小矩边梯形的面积再累加。但是当函数的维度太高,变量数太多的时候,数值方法就不适用了,蒙特卡洛方法从概率学的角度进行积分的近似计算。
我们经常需要计算下面形式的积分:
\(I = \int_{a}^b h(x)g(x)dx\)
对于某些关于随机变量 \(X\) 的函数 \(f(x)\), 其期望值可以通过下面的公式计算:
\(E[x] = \int_{p(x)}p(x)f(x)dx\)
其中 \(p(x)\) 为变量\(X\) 的密度函数,它在定义域上的积分应该为1。
事实上,如果 \(g(x)\) 满足下面的条件:
1. 在区间 \((a,b)\) 上非负
\(g(x)\geqslant0, x\in(a,b)\)
2. 在区间上的积分有限
\(\int_a^b g(x)=C<\infty\)
那么,\(g(x)\) 就可以转换为密度函数
\(p(x)=\frac{g(x)}{C}\)
只需要在积分号前乘以相应的\(C\),就可以保证原积分不变了。那么修改成密度函数后有什么好处呢?修改成密度函数的好处就是:可以通过随机模拟符合这个密度分布的变量\(x\),来求出原积分的近似值:
根据大数定理:
\(E[f(X)] = \int f(x)p(x)dx \approx \frac{1}{S}\sum_{n=1}^S f(x_s)\)
其中\(x_s\sim p(X)\), 这一点很关键,也就是说,生成的随机数必须要符合密度函数为 \(p(X)\) 的分布,只有这样,计算出来的平均值才是积分的近似值。
为了对这种方法进行理论分析,下面给出两个定理:
大数定理 对于一个已知分布的随机序列,当取样数趋于无穷时,其均值趋向于期望。
事实上,在日常生活中我们常常是这么做的,比如统计一年级某门成绩的期望,我们可以随机选一些学生进行抽测,用他们的平均成绩来近似估计该年级的成绩期望,选的学生越多,其均值就越逼近真实期望值。
在统计背景下,\(A(n)\) 是 \(B\) 的一个一致估计量(consistent estimator),如果满足在 \(n\) 趋于无穷时,\(A(n)\) 收敛于 \(B\),也就是说:对任意概率 \(P[0<P<1]\),任意值 \(\delta\),我们都可以找到 \(k\),使得对任意 \(n>k\), \(A(n)\) 与 \(B\) 的差距在 \(\delta\) 内的概率大于 \(P\)。
中心极限定理 大量独立随机变量的和近似服从正态分布。
假如我们有独立同分布(i.i.d)的随机变量 \(z_i\),均值为 \(\mu\),方差为 \(\sigma^2\),n 个这样的变量的和记为 Y:
\(E(Y) = E(\sum\limits_{i=1}^n z_i) = \sum\limits_{i=1}^nE(z_i) = n\mu\)
\(var(Y) = var(\sum\limits_{i=1}^n z_i) = \sum\limits_{i=1}^n var(z_i) = n\sigma^2\)
对变量 Y 进行标准化:
\(\frac{Y-E(Y)}{\sqrt{var(Y)}}=\frac{Y-n\mu}{\sqrt{n}\sigma}\sim\mathcal{N}(0,1)\ as\ n\rightarrow \infty\)
也就是:
\(\frac{\sum\limits_{i=1}^n z_i-n\mu}{\sigma\sqrt{n}}\sim\mathcal{N}(0,1)\ as\ n\rightarrow \infty\)
因此,蒙特克洛方法的误差为:
可以看出:
1. 如果 \(f(x)\) 的方差是有限的,那么 MC 估计是一致的
2. MC 估计的误差是渐进无偏的
3. MC 估计的误差近似正态分布的
4. MC 估计误差的标准差是 \(\sigma=\frac{\sqrt{Var[f(x)]}}{\sqrt{n}}\)
同时,可以发现,MC 估计对数据的维度天然免疫,无论维度多大,只需要按分布函数生成随机变量,计算随机变量的函数值,计算这些函数值的均值,即可得到对积分的估计。由于误差的标准差越小,估计越精确,因此,我们可以通过增大取样数目 \(n\) 的方式来增大 MC 估计的准确性。另一个增加准确性的思路是降低 \(f(x)\) 的方差,这类方法称为 variance-reducing techniques 这里(我)不(没)做(看)介(懂)绍。
实例
1. 通过蒙特卡洛方法计算圆周率
通常的教程中介绍这个例子时会说:正方形中均匀生成的随机点落到圆内的概率为balabala,所以圆的面积比上正方形的面积为balabala,所以圆周率为balabala。这种方法固然好让人理解,但是如何严格地用公式表示这个过程呢?
圆的面积可以用下面的积分来获得:
其中在符合内部条件\(x^2+y^2\leq r^2\)时为1,在不符合内部条件时为0。也就是说,点在圆的内部时,函数值为1,点在圆外部时函数值为0。令 \(p(x)\),\(p(y)\) 符合 \([-r,r]\) 上的均匀分布,因此,\(p(x)=p(y)=\frac{1}{2r}\)。
所以,根据蒙特卡洛积分,\(I = \int_{a}^b f(x)g(x)dx\) ,这里的 \(f(x)\) 转换为二维函数相当于 \(1(x^2+y^2\leq r^2)\),\(g(x)\) 相当于 1,我们把它转化为二维的密度函数,也就是\(p(x,y)=p(x)\cdot p(y)=\frac{1}{4r^2}=\frac{g(x,y)}{4r^2}\)。
所以,
也就是,只需要生成 -r 到 r 均匀分布的横坐标和纵坐标,然后带入\(1(x^2+y^2\leq r^2)\) 判断其是否在圆内,在的话记为1,不在记为0,加和后除以点的总数,计算出落到圆内的概率,最后乘以 \(4r^2\) 求出圆的面积,知道了圆的面积,又知道半径了,自然也可以求出圆周率的近似值。
% Radious of circle
r = 1;
S = 10000;
% Generate S points uniformly distributed points
x = unifrnd(-r,r,S,1);
y = unifrnd(-r,r,S,1);
% The points falled into the circle
fxy = (x.^2+y.^2-r^2<=0);
area = 4*r^2/S*sum(fxy);
pi_estimate = area/r^2; % Visualization
figure;
inside = fxy; outside = logical(1-fxy);
scatter(x(inside),y(inside),15,'r','filled');
hold on;
scatter(x(outside),y(outside),15, 'b','filled');
axis equal;
xlim([-1,1]);
ylim([-1,1]);
2. 通过蒙特卡洛方法近似计算\(xe^x\) 的积分
我们想计算 \(I = \int_0^1 xe^xdx\) , 由分部积分公式,不难得到其积分值为1。下面通过蒙特卡洛方法求其近似值,看是否与1接近。
可以把\(f(x)\) 看成 \(xe^x\),\(g(x)\) 看成 1,由于积分区间长度也是1,故概率分布的密度函数为\(p(x)=\frac{gx}{\int_0^1 g(x)dx}=1\)。
所以,根据上文的讨论,只需要在0到1中均匀取得随机数,然后带入\(f(x)=xe^x\) 中计算函数值,最后求均值即可得到积分的近似。
代码如下:
rng('default');
% 100 sample
S1 = 100;
x1 = unifrnd(0,1,S1,1);
y1 = x1.*exp(x1);
I1 = sum(y1)/S1; % 10000 samples
S2 = 10000;
x2 = unifrnd(0,1,S2,1);
y2 = x2.*exp(x2);
I2 = sum(y2)/S2;
3. 计算beta分布的期望
关于Beta分布,详细的资料请移步百度文库,这里只介绍一点:beta分布含有两个参数 A,B。对于随机变量 \(X\sim Beta(A,B)\),\(E(x)=\frac{A}{A+B}\)。
计算 Beta 分布的期望,使用如下公式:
\(E(x)=\int_{p(x)}p(x)xdx\), where \(x\sim Beta(\alpha_1\alpha_2)\)
1. 首先我们发现 \(f(x)=x\),而\(p(x)\) 本身就是概率密度函数,所以不用进行转换。
2. 我们根据概率分布 \(p(x)=Beta(\alpha_1,\alpha_2)\) 来生成大量随机的点,然后带入 \(f(x)=x\),求出其均值,即为 Beta 分布的期望。
rand('seed',12345);
alpha1 = 2; alpha2 = 10;
N = 10000;
x = betarnd(alpha1,alpha2,1,N);%生成10000个按Beta分布的点 % MONTE CARLO EXPECTATION
expectMC = mean(x);%由MC方法算出的期望近似值 % ANALYTIC EXPRESSION FOR BETA MEAN
expectAnalytic = alpha1/(alpha1 + alpha2);%Beta分布的理论期望值 % DISPLAY
figure;
bins = linspace(0,1,50);%将[0,1]区间分成50份,最后一份是大于50的部分
counts = histc(x,bins);%统计每个小区间内落入的随机点的数目
probSampled = counts/sum(counts);%Beta分布的点落入每个小区间对应的概率
probTheory = betapdf(bins,alpha1,alpha2);%每个区间点的理论概率密度值
b = bar(bins,probSampled); colormap hot; hold on;%概率分布直方图,注意这里每个竖条代表的是对应区间的概率,不是概率密度。当它除以区间长度时才是概率密度
t = plot(bins,probTheory/sum(probTheory),'r','Linewidth',2)%这里probTheory/sum(probTheory)相当于是probTheory*dx,因为sum(probTheory*dx)=1, dx=1/sum(probTheory)
m = plot([expectMC,expectMC],[0 .1],'g')%期望的近似值
e = plot([expectAnalytic,expectAnalytic],[0 .1],'b')%期望的理论值
xlim([expectAnalytic - .05,expectAnalytic + 0.05])
legend([b,t,m,e],{'Samples','Theory','$\hat{E}$','$E_{Theory}$'},'interpreter','latex');
title(['E_{MC} = ',num2str(expectMC),'; E_{Theory} = ',num2str(expectAnalytic)])
hold off
从图中我们可以看到两条竖线十分接近,也就是说由样本估计的均值十分接近真实值。
Monte Carlo approximation for optimization
蒙特卡洛方法还可以用来求解优化问题:
\(x_{opt}=\arg\max g(x)\)
如果 \(g(x)\) 满足之前提到的两条性质:1. 非负 2. 积分有限
那么,就可以将其放缩为密度函数:
\(p(x) = \frac{g(x)}{C}\)
其中 \(C = \int_x g(x) dx\)
原优化问题变形为:
\(x_{opt}=\arg\max\limits_x Cp(x)\)
以 \(p(x)\) 为概率密度函数生成随机数,那么,在随机数密度最大的地方,对应的密度函数必然也是最大的,而密度函数与目标函数之间只差一个常数的放缩,故而该位置也是目标函数最大的地方,也就是说,这一点就是优化问题的近似解。
实例
求解优化问题 \( x_{opt}=\arg\max\limits_x e^{-\frac{(x-4)^2}{2}}\)
通过求导,令导函数为零,可以求得极值点为 x=4。
同时可以观察到,被优化函数\(g(x)\)与正态分布只差了一个参数:\( \sqrt{2\pi}\)
原问题可以变形为:
其中\(C=\sqrt{2\pi}\)。
因此,可以借助matlab生成均值为4,方差为1的正态分布随机变量,然后找出其密度函数最大的点对应的横坐标,此即为优化问题的解。
代码如下:
% MONTE CARLO OPTIMIZATION OF exp(x-4)^2
randn('seed',12345) % INITIALZIE
N = 100000;
x = 0:.1:6;
C = sqrt(2*pi);
g = inline('exp(-.5*(x-4).^2)','x');
ph = plot(x,g(x)/C,'r','Linewidth',3); hold on%画出密度函数
gh = plot(x,g(x),'b','Linewidth',2); hold on;%画出待优化函数
y = normpdf(x,4,1); % CALCULATE MONTE CARLO APPROXIMATION
x = normrnd(4,1,1,N);
bins = linspace(min(x),max(x),100);%生成100个随机区间
counts = histc(x,bins);%统计100个区间中每一个区间落入的随机点数
[~,optIdx] = max(counts);%找到落入点最多的区间的下标
xHat = bins(optIdx);%找到优化问题的近似解 % OPTIMA AND ESTIMATED OPTIMA
oh = plot([4 4],[0,1],'k');
hh = plot([xHat,xHat],[0,1],'g'); set(gca,'fontsize',16)
legend([gh,ph,oh,hh],{'g(x)','$p(x)=\frac{g(x)}{C}$','$x_{opt}$','$\hat{x}$'},'interpreter','latex','Location','Northwest');
可以看到,通过蒙特卡洛算法得到的优化问题的解与真实解基本一致。
Monte Carlo Approximations的更多相关文章
- Monte Carlo方法简介(转载)
Monte Carlo方法简介(转载) 今天向大家介绍一下我现在主要做的这个东东. Monte Carlo方法又称为随机抽样技巧或统计实验方法,属于计算数学的一个分支,它是在上世纪四十年代 ...
- 增强学习(四) ----- 蒙特卡罗方法(Monte Carlo Methods)
1. 蒙特卡罗方法的基本思想 蒙特卡罗方法又叫统计模拟方法,它使用随机数(或伪随机数)来解决计算的问题,是一类重要的数值计算方法.该方法的名字来源于世界著名的赌城蒙特卡罗,而蒙特卡罗方法正是以概率为基 ...
- PRML读书会第十一章 Sampling Methods(MCMC, Markov Chain Monte Carlo,细致平稳条件,Metropolis-Hastings,Gibbs Sampling,Slice Sampling,Hamiltonian MCMC)
主讲人 网络上的尼采 (新浪微博: @Nietzsche_复杂网络机器学习) 网络上的尼采(813394698) 9:05:00 今天的主要内容:Markov Chain Monte Carlo,M ...
- (转)Markov Chain Monte Carlo
Nice R Code Punning code better since 2013 RSS Blog Archives Guides Modules About Markov Chain Monte ...
- [其他] 蒙特卡洛(Monte Carlo)模拟手把手教基于EXCEL与Crystal Ball的蒙特卡洛成本模拟过程实例:
http://www.cqt8.com/soft/html/723.html下载,官网下载 (转帖)1.定义: 蒙特卡洛(Monte Carlo)模拟是一种通过设定随机过程,反复生成时间序列,计算参数 ...
- Introduction to Monte Carlo Tree Search (蒙特卡罗搜索树简介)
Introduction to Monte Carlo Tree Search (蒙特卡罗搜索树简介) 部分翻译自“Monte Carlo Tree Search and Its Applicati ...
- (转)Monte Carlo method 蒙特卡洛方法
转载自:维基百科 蒙特卡洛方法 https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%9 ...
- Introduction To Monte Carlo Methods
Introduction To Monte Carlo Methods I’m going to keep this tutorial light on math, because the goal ...
- 强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods)
强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods) 学习笔记: Reinforcement Learning: An Introduction, Richard S ...
随机推荐
- git学习笔记总结
git试免费的开源的分布式版本控制系统,github是一个用git做版本控制的项目托管平台.说白了git就是帮忙你管理你开发的代码,代码每次修改的历史,多人更好的一起开发项目. 分布式版本控制系统,每 ...
- JQuery中的id选择器含有特殊字符时,不能选中dom元素
1.jquery类库在我们实际项目中用的很多,大家经常需要根据控件的id,获取对应的html元素.但是:当id含有特殊字符的时候,是不能选中的 2.jquery的id选择器只支持,单词.阿拉伯数字.下 ...
- 横向滑动的HorizontalListView滑动指定位置的解决方法
项目中用到了自定义横向滑动的控件:HorizontalListView,点击其中一项,跳转到另外一个大图界面,大图界面也是HorizontalListView,想使用setSelection方法设定 ...
- VRP
VRP系统命令采用分级保护方式,命令被划分为参观级.监控级.配置级.管理级4个级别. 参观级:网络诊断工具命令(ping.tracert).从本设备出发访问外部设备的命令(包括:Telnet客户端.S ...
- 001_kafka起步
一.简介 Kafka is a distributed, partitioned, replicated commit log service. It provides the functionali ...
- 【apache】yum 安装Apache(Centos 6.5)
一.首先在系统上面查询一下是否已经安装了apache [Apache在linux系统里的名字是httpd] rpm -qa httpd 如果有返回的信息,则会显示已经安装的软件.如果没有则 ...
- label for
一般我们在使用radio 时都是结合label来使用的 <label><input type=”radio” name=”radio” value=’0’/>男</l ...
- jQuery实现滚动效果详解1
声明:第一次写原创,本人初学,很多地方一知半解,本篇算是一个学习的笔记,欢迎批评指正,转载请注明. 今天要做的效果是在网上经常能看到多幅图片向左无缝滚动,鼠标滑过动画暂停,鼠标滑出动画继续的效果.网上 ...
- Android 之 Activity的生命周期
- 求助,JS 方法调用的问题,写了返回值,确调用时返回Undefined(新人第一次写)
文本框txtUserName 的Onbulr 绑定方法 txtUserNameOnblur 这可以正常执行 而下面的btnRegister 的click 事件则无法正常调用 txtUserNa ...