MC采样(随机投点法)——附代码

1.MC采样(随机投点法)理论基础

在数学上,一般用蒙特卡罗方法去估计 一些不能求解的积分值。
                 ~~~~~~~~~~~~~~~~                  核心思想:面积占比。积分值在理论上可以表示为面积。
在统计学,蒙特卡罗方法一般用于求解给定概率密度函数下的采样点集合。
                 ~~~~~~~~~~~~~~~~                  主要方法:根据概率密度函数建立拒绝接受机制。

用蒙特卡罗方法计算定积分(随机投点法)
设0<=f(x)<=1,求f(x)在区间[0,1]上的积分值
J = ∫ 0 1 f ( x ) d x (1) J=\int_{0}^{1}f(x)dx \tag{1} J=01f(x)dx(1)
设二维随机变量(X,Y)服从正方形{0<=x<=1,0<=y<=1}上的均匀分布,则可知X服从[0,1]上的均匀分布,Y也服从[0,1]上的均匀分布,且X与Y独立。又记事件A={Y<=f(X)},则
P ( A ) = P ( Y < = f ( X ) ) = ∫ − ∞ + ∞ ∫ 0 f ( x ) d y d x = ∫ − ∞ + ∞ f ( x ) d x = ∫ 0 1 f ( x ) d x = J (2) P(A)=P(Y<=f(X))=\int_{-\infty}^{+\infty}\int_{0}^{f(x)}dydx=\int_{-\infty}^{+\infty}f(x)dx=\int_{0}^{1}f(x)dx=J \tag{2} P(A)=P(Y<=f(X))=+0f(x)dydx=+f(x)dx=01f(x)dx=J(2)
即定积分的值J就是事件A的概率p.由伯努利大数定律,我们可以用重复实验中A出现的频率作为p的估计值。
这种求定积分的方法也称随机投点法,即将(X,Y)看成是向正方形{0<=x<=1,0<=y<=1}内的随机投的点,用随机投的点落在区域{y<=f(x)}中的频率作为定积分的近似值。

2.具体步骤:

(1)先用计算机产生(0,1)上均匀分布的n对随机数(xi,yi),i=1,2,…n,这里n可以很大,建议取n=10000,n=100000.
(2)对n对数对(xi,yi),i=1,2,…n,记录满足如下不等式
y i < = f ( x i ) (3) yi<=f(xi) \tag{3} yi<=f(xi)(3)
的次数,这就是事件A发生的频数Sn,由此可得事件A发生的频率 S n n \frac{Sn}{n} nSn.可以近似估计J值。
满足式(3)不等式的xi样本点集合即为按照概率密度f(x)采样得到的样本点集合。

3. 概念理解

建立拒绝接受机制,若y

从概率论角度理解:采样点依概率分布发生,概率大的事件比较容易发生。

从几何角度理解:

拒绝接受机制会在x*y矩形中随机均匀撒点,但是只有在曲线f(x)下面的点会被接受成为样本点。
进一步,因为是均匀撒点,概率密度小的地方采样点数量少,密度大的地方采样点数量多。随即均匀采样保证了被采样的点集合的概率密度分布与f(x)吻合。
综上采样可行的保障机制:(均匀采样)and (y 因为当{0<=x<=1,0<=y<=1}时,整个矩形面积为 1 × 1 1\times1 1×1,曲线面积为函数积分面积J,所以有效采样概率为 J 1 × 1 = J \frac{J}{1\times1}=J 1×1J=J

概率密度函数

f ( x ) = ( x − 0.4 ) 4 ∫ 0 1 ( x − 0.4 ) 4 d x f(x)=\frac{(x-0.4)^4}{\int_{0}^{1}(x-0.4)^4dx} f(x)=01(x0.4)4dx(x0.4)4

采样区间[0,1]

import numpy as np
import matplotlib.pyplot as plt
import math
import random
import os 

#概率密度函数f(x)=(x-0.4)^4/f_0_1(x-0.4)^4dx
#积分区间[0,1]

#step1 生成随机数种子,确保实验可复现
seed=13
random.seed(seed)
np.random.seed(seed)
os.environ['PYTHONHASHSEED']=str(seed)

#step2 建立拒绝接受机制,若y

MC采样(随机投点法)——附代码_第1张图片

上述代码中,有效采样点集合存储在samples列表里。
上图中看出,有效采样点集合概率密度分布与f(x)一致,可以认为其是f(x)的成功采样点集合。

附加:
1.如何实现采取原概率密度函数 f ( x ) = ( x − 0.4 ) 4 ∫ 0 1 ( x − 0.4 ) 4 d x f(x)=\frac{(x-0.4)^4}{\int_{0}^{1}(x-0.4)^4dx} f(x)=01(x0.4)4dx(x0.4)4在[0,0.4]或者[0.4,1]区间上的采样集合?(采取[0,1]区间采样集合——将集合中元素根据大小区分——分别得到[0,0.4]或者[0.4,1]区间上的采样集合。
2.如何采取 f ( x ) = ( x − 0.4 ) 4 ∫ 0 0.4 ( x − 0.4 ) 4 d x f(x)=\frac{(x-0.4)^4}{\int_{0}^{0.4}(x-0.4)^4dx} f(x)=00.4(x0.4)4dx(x0.4)4在[0,0.4]区间上的采样集合?
或者如何采取 f ( x ) = ( x − 0.4 ) 4 ∫ 0.4 1 ( x − 0.4 ) 4 d x f(x)=\frac{(x-0.4)^4}{\int_{0.4}^{1}(x-0.4)^4dx} f(x)=0.41(x0.4)4dx(x0.4)4在[0.4,1]区间上的采样集合?

后续会更新

参考文章:
1.马尔可夫链蒙特卡罗算法(MCMC)
2.markdown最简单的公式居中以及编号方法
3.markdown 数学公式 累加、连乘与乘号的代码

你可能感兴趣的:(python,python,画图,jupyter,python,机器学习,开发语言)