蒙特卡洛采样【python实例】

news2024/11/19 7:44:57

文章目录


蒙特卡洛方法(Monte Carlo Simulation)是一种近似推断的方法,通过采样大量粒子的方法来求解期望、均值、面积、积分等问题。

蒙特卡洛对某一种分布的采样方法有直接采样、接受拒绝采样与重要性采样三种:

  • 直接采样最简单,但是需要已知累积分布的形式,并且好求逆函数,得到p(x)分布的样本
  • 接受拒绝采样是给出一个提议分布,对满足原分布的粒子接受,得到服从p(x)分布的样本
  • 重要性采样则是给予每个粒子不同的权重,计算f(x)在概率分布p(x)下的均值

一、均匀分布采样

均匀分布Uniform(0,1)的样本是相对容易生成的。 通过线性同余发生器(LCG)可以生成伪随机数,我们用确定性算法生成[0,1]之间的伪随机数序列后, 这些序列的各种统计指标和均匀分布Uniform(0,1)的理论计算结果非常接近。这样的伪随机序列就有比较好的统计性质,可以被当成真实的随机数使用。

线性同余随机数生成器如下:
x n + 1 = ( a x n + c ) m o d    m x_{n+1}=(ax_n+c)\mod m xn+1=(axn+c)modm式中acm是数学推导出的合适的常数。这种算法产生的下一个随机数完全依赖当前的随机数,当随机数序列足够大的时候,随机数会出现重复子序列的情况。

二、直接采样

直接采样的方法是根据概率分布进行采样。对一个已知概率密度函数(比如均匀分布)与累积概率密度函数的概率分布,我们可以直接从累积分布函数(cdf)进行采样。

原理:

逆变换方法.png

设x服从概率密度函数为 F ( x ) = 1 − e − x F(x)=1-e^{-x} F(x)=1ex的分布,则可以通过逆变换的方法对F(x)直接采样,产生服从F(X)分布的样本X.
令 y = 1 − e − x → e − x = 1 − y 两边求对数可得 : x = − l n ( 1 − y ) 令\quad y=1-e^{-x} \rightarrow e^{-x}=1-y \\ 两边求对数可得:x=-ln(1-y) y=1exex=1y两边求对数可得:x=ln(1y)
F − 1 ( x ) = − l n ( 1 − x ) F^{-1}(x)=-ln(1-x) F1(x)=ln(1x)

x i x_i xi为均匀分布样本,则 X i = − l n ( 1 − x i ) X_i=-ln(1-x_i) Xi=ln(1xi)为服从累积密度函数为F(x)分布的样本

三、拒绝接受采样

对于累积分布函数比较复杂,不好求反函数的分布,我们可以采用接受-拒绝采样。如下图所示,p(z)是我们希望采样的分布,q(z)是我们提议的分布(proposal distribution),q(z)分布比较简单,令kq(z)>p(z),我们首先在kq(z)中按照直接采样的方法采样粒子,接下来判断这个粒子落在途中什么区域,对于落在蓝线以外的粒子予以拒绝,落在蓝线下的粒子接受,最终得到符合p(z)的N个粒子。

拒绝采样

拒绝接受采样的基本步骤:

  1. 生成服从q(x)的样本 → x i \rightarrow x_i xi
  2. 生成服从均匀分布U(0,1)的样本—— u i u_i ui
  3. q ( x i ) ⋅ u i < p ( x i ) q(x_i)\cdot u_i<p(x_i) q(xi)ui<p(xi),也就是二维点落在蓝线以下,此时接受 X k = x i X_k=x_i Xk=xi
  4. 最终得到的 X k X_k Xk为服从p(x)的样本

实例

定义拒绝抽样函数:

def Reject_Sampling(p,q_x):
    """对p(x)进行拒绝采样

    Args:
        p (_type_): 目标CDF函数
        q_x (_type_): 选取的简单概率密度函数

    Returns:
        _type_: 采样样本
    """
    size = 1e+05   #初始采样点
    k=10
    sample=[]
    for _ in range(int(size)):      #不建议用for循环,速度慢,这样写比较好理解
        xi=np.random.normal(0,1)
        qi=k*q_x.pdf(xi)   #乘上系数
        ui=np.random.uniform(0,1)
        pi=p(xi)

        #判断
        if qi*ui<pi:
            sample.append(xi)

    return sample 

实验并作图:

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats

def f(x):
    fx=np.exp(-(x**2)/2)*(np.sin(6+x)**2+3*(np.cos(x)**2)*(np.sin(4*x)**2)+1)
    return fx
  
q_x = stats.norm(0, 1)
RS=Reject_Sampling(f,q_x)   #抽样数据集

fig,ax=plt.subplots(figsize=(10,5))
ax.hist(RS,bins=2000,density = True, stacked=True)  #画出抽样分布
ax.set_xlabel('x', fontsize=15)
ax.set_ylabel("f(x)", fontsize=15)
ax.set_title("Rejection Sampling", fontsize=20)

四、重要性采样

(1) 目的

重要性采样的目的:求一个f(x)在p(x)分布下的期望,即 E ( f ( x ) ) = ∫ f ( x ) p ( x ) d x E(f(x))=\int f(x)p(x)dx E(f(x))=f(x)p(x)dx,当p(x)很复杂时,不解析,积分不好求时,可以通过重要性采样来计算。当 f ( x ) = x f(x)=x f(x)=x,则可以算E(x)在p(x)分布下的期望.

(2) 原理

首先, 当我们想要求一个函数 f ( x ) f(x) f(x) 在区间 [ a , b ] [a, b] [a,b] 上的积分 ∫ a b f ( x ) d x \int_{a}^{b} f(x) d x abf(x)dx 时有可能会面临一个问题, 那就是积分曲线难以解析, 无法直接求积分。这时候我们可以采用一种估计的方式, 即在区 间 [ a , b ] [a, b] [a,b] 上进行采样: { x 1 , x 2 … , x n } \left\{x_{1}, x_{2} \ldots, x_{n}\right\} {x1,x2,xn}, 值为 { f ( x 1 ) , f ( x 2 ) , … , f ( x n ) } \left\{f\left(x_{1}\right), f\left(x_{2}\right), \ldots, f\left(x_{n}\right)\right\} {f(x1),f(x2),,f(xn)} .

如果采样是均匀的, 即如下图所示:

截屏2022-03-30 下午4.59.23

那么显然可以得到这样的估计: ∫ a b f ( x ) d x = b − a N ∑ i = 1 N f ( x i ) \int_{a}^{b} f(x) d x=\frac{b-a}{N} \sum_{i=1}^{N} f\left(x_{i}\right) abf(x)dx=Nbai=1Nf(xi)在这里 b − a N \frac{b-a}{N} Nba 可以看作是上面小长方形的底部的 “宽”, 而 f ( x i ) f\left(x_{i}\right) f(xi) 则是坚直的 “长”。

上述的估计方法随着取样数的增长而越发精确,那么有什么方法能够在一定的抽样数量基础上来增加准确度,减少方差呢?比如x样本数量取10000,那么显然在f(x)比较大的地方,有更多的 x i x_i xi,近似的积分更精确,如下图所示,在圆圈部分 x i x_i xi样本应该更多,所以 x i x_i xi就不用均匀分布产生。

截屏2022-03-30 下午5.03.28

并且原函数 f ( x ) f(x) f(x) 也许本身就是定义在一个分布之上的, 我们定义这个分布为 π ( x ) \pi(x) π(x), 我们无法直接从 π ( x ) \pi(x) π(x) 上进行采样, 所以另辟蹊径重新找到一个更加简明的分布 p ( x ) p(x) p(x), 从它进行取样, 希望间接地求出 f ( x ) f(x) f(x) 在分布 π ( x ) \pi(x) π(x) 下的期望。

(2.1) π ( x ) 归一化 \pi(x)归一化 π(x)归一化

搞清楚了这一点我们可以继续分析了。首先我们知道函数 f ( x ) f(x) f(x) 在概率分布 π ( x ) \pi(x) π(x) 下的期望为:
E [ f ] = ∫ x π ( x ) f ( x ) d x E[f]=\int_{x} \pi(x) f(x) d x E[f]=xπ(x)f(x)dx

但是这个期望的值我们无法直接得到, 因此我们需要借助 p ( x ) p(x) p(x) 来进行采样, p ( x ) p(x) p(x) 可以选取简单的分布,比如设p(x)为均匀分布,当我们在 p ( x ) p(x) p(x) 上采样 { x 1 , x 2 , … , x n } \left\{x_{1}, x_{2}, \ldots, x_{n}\right\} {x1,x2,,xn} (即 x i x_i xi服从p(x)分布)后可以估计 f f f 在分布 p ( x ) p(x) p(x) 下的期望为:
E [ f ] = ∫ x p ( x ) f ( x ) d x ≈ 1 N ∑ i = 1 N f ( x i ) 。 E[f]=\int_{x} p(x) f(x) d x \approx \frac{1}{N} \sum_{i=1}^{N} f\left(x_{i}\right) 。 E[f]=xp(x)f(x)dxN1i=1Nf(xi)接着我们可以对式子进行改写, 即: π ( x ) f ( x ) = p ( x ) π ( x ) p ( x ) f ( x ) \pi(x) f(x)=p(x) \frac{\pi(x)}{p(x)} f(x) π(x)f(x)=p(x)p(x)π(x)f(x), 所以我们可以得到:
E [ f ] = ∫ x p ( x ) π ( x ) p ( x ) f ( x ) d x E[f]=\int_{x} p(x) \frac{\pi(x)}{p(x)} f(x) d x E[f]=xp(x)p(x)π(x)f(x)dx这个式子我们可以看作是函数 π ( x ) p ( x ) f ( x ) \frac{\pi(x)}{p(x)} f(x) p(x)π(x)f(x) 定义在分布 p ( x ) p(x) p(x) 上的期望, 当我们在 p ( x ) p(x) p(x) 上采样 { x 1 , x 2 , … , x n } \left\{x_{1}, x_{2}, \ldots, x_{n}\right\} {x1,x2,,xn} (服从p(x)分布),可以估计 f f f 的期望:

E [ f ] = 1 N ∑ i = 1 N π ( x i ) p ( x i ) f ( x i ) = 1 N ∑ i = 1 N w i f ( x i ) \begin{aligned} E[f]&=\frac{1}{N} \sum_{i=1}^{N} \frac{\pi\left(x_{i}\right)}{p\left(x_{i}\right)} f\left(x_{i}\right)\\ &=\frac{1}{N} \sum_{i=1}^{N} w_i f\left(x_{i}\right) \end{aligned} E[f]=N1i=1Np(xi)π(xi)f(xi)=N1i=1Nwif(xi)在这里 w i = π ( x i ) p ( x i ) w_i=\frac{\pi\left(x_{i}\right)}{p\left(x_{i}\right)} wi=p(xi)π(xi)就是重要性权重

(2.2)若 π ( x ) ( 即 p ( x ) 没有归一化 \pi(x)(即p(x)没有归一化 π(x)(p(x)没有归一化

E ( f ( X ) ) = ∫ f ( x ) p ( x ) ∫ p ( x ) d x d x = ∫ f ( x ) p ( x ) d x ∫ p ( x ) d x = ∫ f ( x ) p ( x ) q ( x ) q ( x ) d x ∫ p ( x ) q ( x ) q ( x ) d x \begin{aligned} E(f(X))&=\int f(x) \frac{p(x)}{\int p(x) d x} d x\\ &=\frac{\int f(x) p(x) d x}{\int p(x) d x}\\ &=\frac{\int f(x) \frac{p(x)}{q(x)} q(x) d x}{\int \frac{p(x)}{q(x)} q(x) d x} \end{aligned} E(f(X))=f(x)p(x)dxp(x)dx=p(x)dxf(x)p(x)dx=q(x)p(x)q(x)dxf(x)q(x)p(x)q(x)dx而分子分母可分别得到:
∫ f ( x ) p ( x ) q ( x ) q ( x ) d x ≈ 1 n ∑ i = 1 n W i f ( x i ) ∫ p ( x ) q ( x ) q ( x ) d x ≈ 1 n ∑ i = 1 n W i \begin{aligned} \int f(x) \frac{p(x)}{q(x)} q(x) d x &\approx \frac{1}{n} \sum_{i=1}^{n} W_{i} f\left(x_{i}\right) \\ \int \frac{p(x)}{q(x)} q(x) d x &\approx \frac{1}{n} \sum_{i=1}^{n} W_{i} \end{aligned} f(x)q(x)p(x)q(x)dxq(x)p(x)q(x)dxn1i=1nWif(xi)n1i=1nWi则最终可得E(f(x)):
E ( f ( X ) ) ≈ ∑ i = 1 n w i f ( x i ) , w i = W i ∑ i = 1 n W i \begin{aligned} E(f(X)) \approx \sum_{i=1}^{n} w_{i} f\left(x_{i}\right), w_{i}=\frac{W_{i}}{\sum_{i=1}^{n} W_{i}} \end{aligned} E(f(X))i=1nwif(xi),wi=i=1nWiWi其中 W i = p ( x i ) q ( x i ) W_i=\frac{p(x_i)}{q(x_i)} Wi=q(xi)p(xi).

(3)实例

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
def f(x):   #概率密度函数
    fx=np.exp(-(x**2)/2)*(np.sin(6+x)**2+3*(np.cos(x)**2)*(np.sin(4*x)**2)+1)
    return fx
  
q_x = stats.norm(0, 1) #取q(x)为正太分布
 
# 从 q(x) 进行重要性采样
def Importance_Sampling(f):
    """对f(x)进行重要性采样
    Args:
        f (_type_): 传入f(x)函数

    Returns:
        _type_: 返回采样结果
    """
    EX_list = []
    W=0
    for i in range(n):
        
        x_i = np.random.normal(0, 1)     #x为正太分布的采样样本
        w_i=f(x_i) / (1*q_x.pdf(x_i))    #权重  
        value = x_i*w_i
        W+=w_i
        EX_list.append(value)

    W=W/n
    return EX_list/W        #归一化,并返回采样结果


IS=Importance_Sampling(f)

IS_Mean=np.mean(IS)   

print("E(X)=",IS_Mean)

参考资料

  1. 重要性采样
  2. 蒙特卡洛方法
  3. 一文看懂蒙特卡洛方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1358790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2019数据结构----队列真题

(1)允许增加空间&#xff0c;空间可以改变所以是通过链表,链式存储实现的&#xff1b;占用的空间可以重复使用&#xff0c;所以是循环队列。 (2)队空&#xff1a;frontrear;队满&#xff1a;frontrear->next

TypeScript Array(数组)

目录 1、数组初始化 2、Array 对象 3、数组迭代 4、数组在函数中的使用 4.1、作为参数传递给函数 4.2、作为函数的返回值 5、数组方法 数组对象是使用单独的变量名来存储一系列的值。数组非常常用。假如你有一组数据&#xff08;例如&#xff1a;网站名字&#xff09;…

【整理总结】几十个程序员硬核工具

在我认识的所有程序员里&#xff0c;每个人几乎都有专属于自己的常用工具和相关资源&#xff0c;今天给大家奉上数几十个程序员硬核工具&#xff0c;我相信这里总有一款工具是属于你的&#xff01; 程序员生产力工具大全如下&#xff1a; Idea-Intellij IDEA (java 编程语言 开…

视频智能分析/云存储平台EasyCVR接入海康SDK,通道名称未自动更新该如何解决?

视频监控GB28181平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;也能…

Vue3——element-plus表格组件怎样得到当前行的id

实现方法&#xff1a; <el-table-column property"address" label"操作" show-overflow-tooltip header-align"center" v-slot"scope"><el-button type"success" click"editBtn(scope.row.id)">编辑…

系列三十三、如何将一个springboot jar做成批处理文件

一、将一个springboot jar做成批处理文件 1.1、需求 最近在写【Spring Cloud Alibaba】的系列文章&#xff0c;其中有一个部分是安装Sentinel控制台&#xff0c;使用命令执行完全没有问题&#xff0c;但是命令太长了&#xff0c;每次启动时都要找笔记&#xff0c;然后粘贴到命…

NSSCTF hate eat snake

开启其环境: 将网页另存本地&#xff0c;搜索网页和snake.js是否包含flag文本&#xff0c;没有发现。 审计snake.js。 第7行定义了游戏的速度this.speed this.oldSpeed speed || 10 ; 全文搜索speed&#xff0c;在第237行发现自增代码this.speed; 注释或者删除自增代码&am…

从技术角度分析:HTTP 和 HTTPS 有何不同

网络安全问题正变得日益重要&#xff0c;而 HTTP 与 HTTPS 对用户数据的保护十分关键。本文将深入探讨这两种协议的特点、工作原理&#xff0c;以及保证数据安全的 HTTPS 为何变得至关重要。 认识 HTTP 与 HTTPS HTTP 的工作原理 HTTP&#xff0c;全称超文本传输协议&#xf…

【EI会议征稿通知】第十届先进制造技术与应用材料国际学术会议(ICAMMT 2024)

第十届先进制造技术与应用材料国际学术会议&#xff08;ICAMMT 2024&#xff09; The 10th International Conference on Applied Materials and Manufacturing Technology 至今ICAMMT已连续举办九届&#xff0c;会议先后在三亚、杭州、清远等城市成功召开。每一届最终征集收…

高校电力能耗监测精细化管理系统,提升能源利用效率的利器

电力是高校不可离开的重要能源&#xff0c;为学校相关管理人员提供在线用能查询统计等服务。通过对学校照明用电、空调用电等数据的采集、监控、分析&#xff0c;为学校电能管理制定合理的能源政策提供参考。同时&#xff0c;也可以培养学生的节能意识&#xff0c;学校后勤电力…

Servlet 3.0的异步处理

1、传统Servlet处理 Web容器会为每个请求分配一个线程&#xff0c;默认情况下&#xff0c;响应完成前&#xff0c;该线程占用的资源都不会被释放。若有些请求需要长时间(例如长处理时间运算、等待某个资源)&#xff0c;就会长时间占用线程所需资源&#xff0c;若这类请求很多&…

液冷数据中心生态建设启动:浪潮信息力推绿色算力产业发展

近日&#xff0c;由中国电子技术标准化研究院主办的“节能环保低碳 我们在行动”第二届电子信息行业绿色环保大会在江苏无锡盛大举行。会上&#xff0c;中国电子技术标准化研究院、浪潮信息等五家发起单位共同启动“液冷数据中心生态建设”&#xff0c;浪潮信息服务器产品线总经…

Echarts—词云库(echarts-wordcloud)使用

echarts-wordcloud是基于echarts的一个插件&#xff0c;所以我们要首先安装echarts包&#xff0c;然后再安装echarts-wordcloud的包&#xff0c;这里我的练习项目安装的版本&#xff1b;当然&#xff0c;你可以随意安装你需要的版本&#xff1b; “echarts”: “^5.3.3”, “ec…

基于ssm学生档案管理系统论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 JSP技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

openGauss 5.0.0企业版一主一备安装部署

目录 一、环境准备 1. 华为云购买两台ECS 1.1查看openEuler版本&#xff0c;操作系统版本及CPU的制式是基础 1.2查看CPU模式 1.3操作系统环境准备 2. 集群配置XML文件准备&#xff1a; 2.1集群参数配置&#xff1a; 2.2主机参数配置&#xff1a; 2.3备机参数配置&…

代码随想录算法训练营第五十八天|739. 每日温度、496.下一个更大元素I

代码随想录 (programmercarl.com) 739. 每日温度 栈里面存放的是元素的下标&#xff0c;确保栈里面的下标对应的元素是单调递增的。 如果栈里面存放的是元素的话&#xff0c;就没有办法定位到下标值&#xff0c;无法计算出距离&#xff0c;所以直接就存入下标。 class Solut…

Springboot配置http-Only

项目框架 jdk1.8、springboot2.5.10 情况一 项目中未使用&#xff08;权限认证框架&#xff1a;Sa-Token&#xff09; application.yml文件内增加配置 server.servlet.session.cookie.http-onlytrueserver.servlet.session.cookie.securetrue (此条配置建议也加上) 情况二…

AOP(面向切面编程)基于注解方式配置

不会注解的小伙伴看这里哦&#xff1a;Spring常用注解&#xff01;&#xff01;&#xff01;-CSDN博客 pom.xml <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version&g…

ssm基于WEB的人事档案管理系统的设计与实现论文

摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#xff0c;让整个世界都可以即时通话…

华为 1+X《网络系统建设与运维(初级)》 认证实验上机模拟试题

华为 1X《网络系统建设与运维&#xff08;初级&#xff09;》认证实验上机模拟试题 一、考试背景二、考试说明2.1考试分数说明2.2考试要求2.3考试环境介绍2.4启动考试环境2.5保存答案 三、考试正文3.1考试内容3.1.1任务 1&#xff1a;设备连接3.1.2任务 2&#xff1a;设备命名3…