重要性采样求泊松分布期望

我也不是数值模拟或者统计物理的学生。所以蒙特卡洛之类的概念性的东西也说的不好。下面是我的统计物理的期末作业。关于用重要性分布求离散函数泊松分布的数学期望的。
我觉得这个挺有意思的,所以也花了点时间加上chatgpt折腾了一下,提供一个参考吧,如果有不对的地方,欢迎讨论
具体直接看资源绑定的pdf吧。
或者下面分块放到jupyter notebook里面会更加清楚一点

蒙特卡罗采样

使用Metropolis 算法这样我们可以对任意的采样函数进行采样

import numpy as np
import matplotlib.pyplot as plt

目标分布 g(x) (未归一化)

def g(x):
return x**3

Metropolis 算法 (仅生成整数样本)

def metropolis_sampling(g, x0, delta, num_samples, a, b):
samples = []
x = x0
for _ in range(num_samples):
y = x + np.random.randint(-delta, delta + 1) # 生成整数的提议点
if y < a or y > b:
samples.append(x)
else:
acceptance_ratio = g(y) / g(x)
if np.random.rand() < acceptance_ratio:
x = y
samples.append(x)
return np.array(samples)

设置参数

x0 = 5 # 初始点
delta = 1 # 调整参数
num_samples = 100000 # 样本数
a = 0 # 区间下限
b = 10 # 区间上限

运行 Metropolis 算法

samples = metropolis_sampling(g, x0, delta, num_samples, a, b)

绘制样本分布

plt.hist(samples, bins=np.arange(a, b+1)-0.5, density=True, alpha=0.75, edgecolor=‘black’, label=‘Sampled Distribution’)

绘制目标分布(归一化)

x = np.arange(a, b+1)
y = g(x)
y = y / np.sum(y) # 归一化
plt.plot(x, y, ‘r-’, lw=2, label=‘Target Distribution g ( x ) g(x) g(x)’)

plt.xlabel(‘x’)
plt.ylabel(‘Density’)
plt.title(‘Metropolis Sampling (Integer Samples)’)
plt.legend()
plt.grid(True)
plt.show()

可以看到Metropolis 算法很好的对x^2这个函数进行了采样。因为泊松方程只能取整数,然后我才对蒙特卡洛采样程序进行修改,让他样本的结果只为整数

使用正态分布作为重要性采样

重要性采样函数力求与目标函数接近,正态函数与泊松函数的接近程度更高一点

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
from scipy.stats import poisson

目标分布 g(x) (未归一化的正态分布)

def g(x, mu=5, sigma=1):
return np.exp(-0.5 * ((x - mu) / sigma) ** 2)

Metropolis 算法 (仅生成整数样本)

def metropolis_sampling(g, x0, delta, num_samples, a, b, mu=5, sigma=1):
samples = []
x = x0
for _ in range(num_samples):
y = x + np.random.randint(-delta, delta + 1) # 生成整数的提议点
if y < a or y > b:
samples.append(x)
else:
acceptance_ratio = g(y, mu, sigma) / g(x, mu, sigma)
if np.random.rand() < acceptance_ratio:
x = y
samples.append(x)
return np.array(samples)

设置参数

x0 = 5 # 初始点
delta = 1 # 调整参数
num_samples = 100000 # 样本数
a = 0 # 区间下限
b = 16 # 区间上限
mu = 5 # 正态分布的均值
sigma = 1 # 正态分布的标准差

运行 Metropolis 算法

samples = metropolis_sampling(g, x0, delta, num_samples, a, b, mu, sigma)

绘制样本分布

plt.hist(samples, bins=np.arange(a, b+1)-0.5, density=True, alpha=0.75, edgecolor=‘black’, label=‘Sampled Distribution’)

绘制目标分布(归一化)

x = np.arange(a, b+1)
y = g(x, mu, sigma)
y = y / np.sum(y) # 归一化
plt.plot(x, y, ‘r-’, lw=2, label=‘Target Distribution g ( x ) g(x) g(x)’)

plt.xlabel(‘x’)
plt.ylabel(‘Density’)
plt.title(‘Metropolis Sampling (Integer Samples, Normal Distribution)’)
plt.legend()
plt.grid(True)
plt.show()
#对正态样本100000的统计图,采样的样本趋于原来的正态函数

计算权重 w(x) = P(x) / q(x)

lambda_param = 8
weights = poisson.pmf(samples, lambda_param) / norm.pdf(samples, mu, sigma)

根据权重计算泊松分布的期望值

expectation = np.mean(weights * samples)
print(‘期望值%f’ %expectation)
plt.plot(samples,norm.pdf(samples, mu, sigma),‘*’,label=‘norm’)
plt.plot(samples,poisson.pmf(samples, lambda_param),‘.’,label=‘poisson’)
plt.legend()
plt.show()

这个泊松分布的结果只能用糟糕了形容。从上图采样函数norm和目标函数poisson也可以看出来,这个正态函数的参数取的并不好。
修改一下采样函数的均值另外对于正态分布的标准差也进行一定的修改

设置参数

x0 = 8 # 初始点
delta = 1 # 调整参数
num_samples = 100000 # 样本数
a = 0 # 区间下限
b = 16 # 区间上限
mu = 8 # 正态分布的均值

运行 Metropolis 算法

for sigma in range(1,5):
samples = metropolis_sampling(g, x0, delta, num_samples, a, b, mu, sigma)
# 计算权重 w(x) = P(x) / q(x)
lambda_param = 8
weights = poisson.pmf(samples, lambda_param) / norm.pdf(samples, mu, sigma)

# 根据权重计算泊松分布的期望值
expectation = np.mean(weights * samples)print('sigma=%d' %sigma)
print(f'泊松分布的期望值: {expectation:.5f}')
plt.plot(samples,norm.pdf(samples, mu, sigma),'*',label='norm')   
plt.plot(samples,poisson.pmf(samples, lambda_param),'.',label='poisson')
plt.legend()
plt.show()
print('\n')

至此发现当正态函数的sigma取到3,mu取8的正态函数分布采样能够更加准确的表示泊松函数的形态

设置参数

from IPython.display import display, Math
x0 = 8 # 初始点
delta = 1 # 调整参数
a = 0 # 区间下限
b = 16 # 区间上限
mu = 8 # 正态分布的均值
sigma=3
print(‘误差值计算公式如下’)
formula = r"\frac{|I - I{\text{true}}|}{I{\text{true}}}"
display(Math(formula))
print(‘\n’)
large_list = [10**i for i in range(2, 10)] #生成不同的样本数

for num_samples in large_list:
samples = metropolis_sampling(g, x0, delta, num_samples, a, b, mu, sigma)
# 计算权重 w(x) = P(x) / q(x)
lambda_param = 8
weights = poisson.pmf(samples, lambda_param) / norm.pdf(samples, mu, sigma)

# 根据权重计算泊松分布的期望值
expectation = np.mean(weights * samples)print('样本数=%d' %num_samples)
print(f'泊松分布的期望值: {expectation:.5f}')
print('误差值%s:' %(abs(round(expectation, 5)-lambda_param)/lambda_param))plt.plot(samples,norm.pdf(samples, mu, sigma),'*',label='norm')   
plt.plot(samples,poisson.pmf(samples, lambda_param),'.',label='poisson')
plt.legend()
plt.show()
print('\n')

总结

1泊松分布的期望为参数λ=8
2重要性采样中,采样函数和目标函数越解决期望越准确
3根据大数定律样本数越多,估算的期望越准确
4目标函数如果只能取整数,那么样本也只能取整数

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

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

相关文章

CatBoost原生接口和Sklearn接口参数详解

CatBoost原生接口和Sklearn接口参数详解 LightGBM原生接口和Sklearn接口参数详解XGBoost原生接口和Sklearn接口参数详解CatBoost一、Sklearn风格接口CatBoostRegressor参数CatBoostRegressor.fit参数CatBoostRegressor.predict参数 二、Catboost原生接口CatBoost PoolCatBoost可…

「媒体邀约」全国巡演,多地推介会,如何做好媒体宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 我们在做多地活动的时候&#xff0c;比如演唱会&#xff…

【LeetCode】十一、滑动窗口:长度最小的子数组 + 定长子串的元音最大数目

文章目录 1、滑动窗口2、leetcode209&#xff1a;长度最小的子数组3、leetcode1456&#xff1a;定长子串中元音的最大数目 1、滑动窗口 如下&#xff0c;有一个数组&#xff0c;现三个元素为一组&#xff0c;求最大的和&#xff0c;自然可以while循环实现&#xff1a;i 、i1、…

数据结构(Java):迭代器遍历【底层源码解析】

1、引言 我们知道&#xff0c;对于List系列集合&#xff0c;添加的元素是有序、可重复、有索引的&#xff1b;而对于Set系列集合&#xff0c;添加的元素是无序、不重复、无索引的。 那么使用for循环通过下标来对Set系列集合进行遍历&#xff0c;那显然是不行的。 迭代器就可…

Spring的AOP概念详解

AOP详解&#xff1a; 1.介绍&#xff1a; 面向切面编程&#xff0c;是一种将非业务代码与业务代码进行分离的一种思想&#xff0c;在实际开发中,往往有许多重复操作,例如事务提交,权限验证,保存口志等功能需要在业务代码重复调用&#xff0c;面向切面编程,就是将非业务代码进…

51单片机-让一个LED灯闪烁、流水灯(涉及:自定义单片机的延迟时间)

目录 设置单片机的延迟&#xff08;睡眠&#xff09;函数查看单片机的时钟频率设置系统频率、定时长度、指令集 完整代码生成HEX文件下载HEX文件到单片机流水灯代码 (自定义延迟时间) 设置单片机的延迟&#xff08;睡眠&#xff09;函数 查看单片机的时钟频率 检测前单片机必…

算法:递归数组求和

递归数组求和 给定一个数组&#xff0c;求所有元素的和 算法思想&#xff1a; 传入数组和下标&#xff0c;如果下标越界就返回0&#xff0c;否则返回当前值和下一个值的和&#xff0c;递归操作。 Java实现&#xff1a; public class Main {public static int func(int[] a…

数据结构第09节:二叉树

树是一种非线性的数据结构&#xff0c;它由节点和边组成。每个节点可以有零个或多个子节点。在树中&#xff0c;没有循环&#xff0c;并且所有的节点都是通过边连接的。 树的基本概念&#xff1a; 根节点&#xff1a;没有父节点的唯一节点。子节点&#xff1a;一个节点可以直接…

JVM的五大内存区域

JVM的五大内存区域 JVM内存区域最粗略的划分可以分为 堆 和 栈 &#xff0c;当然&#xff0c;按照虚拟机规范&#xff0c;可以划分为以下几个区域&#xff1a; JVM内存分为线程独享区和线程共享区&#xff0c; 其中 方法区 和 堆 是线程共享区&#xff0c; 虚拟机栈, 本地方法…

[知识点]-[宽搜bfs]

离开中山路 #include<bits/stdc.h> #define fi first #define se second #define pb push_back #define PII pair<int,int > #define int long long #define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);using namespace std;const int N 1e6…

延边幼儿园1*3 OLED柔性屏翻页一体机安装项目

一、产品介绍 本次项目在吉林省延吉市延边幼儿园内&#xff0c;引入了先进的55寸1*3 OLED柔性屏翻页一体机。该设备集高清显示、灵活翻页、互动教学等功能于一体&#xff0c;专为现代幼儿教育环境设计&#xff0c;旨在通过科技手段提升教学质量&#xff0c;丰富教学手段&#x…

数据库重命名脚本

由于原本的数据库命名不规范&#xff0c;需要进行重新命名&#xff0c;最终确定方案为新建数据库后迁移表&#xff0c;以下为脚本。 #!/bin/bashecho -e "\033[34m 此脚本功能为修改数据库名称&#xff08;需要新建数据库后将数据迁移到新数据库&#xff09;&#xff0c;…

rtsp client c++

直接上代码&#xff1a;源码 void doRtspParse(char *b) {std::vector<std::string> res;char *ptr b, *ptr1 nullptr;while ((ptr1 strstr(ptr, "\r\n"))) {res.push_back(std::string(ptr, ptr1 - ptr));ptr ptr1 2;}int len ptr - b;b[len - 1] \0;…

1.1.2数据结构的三要素

一.数据结构的三要素 数据结构这门课着重关注的是数据元素之间的关系&#xff0c;和对这些数据元素的操作&#xff0c;而不关心具体的数据项内容 。 1.逻辑结构 &#xff08;1&#xff09;集合结构 &#xff08;2&#xff09;线性结构 数据元素之间是一对一的关系。除了第一个…

如何选择鼠标和键盘@无线外设鼠标键盘连接方案对比

文章目录 鼠标续航问题充电接口鼠标模式数低功耗蓝牙总结 键盘首要因素&#x1f47a;下面是详细对比 鼠标 关于蓝牙鼠标、2.4GHz无线鼠标和有线鼠标的详细对比表格&#xff0c;特别关注消费者相关的特性&#xff1a; 特性蓝牙鼠标2.4GHz无线鼠标有线鼠标连接方式蓝牙2.4GHz无…

MongoDB-社区版-本地安装

系统&#xff1a;win10 1. 下载server:Download MongoDB Community Server | MongoDB 我选的zip包 2. 下载shell&#xff1a;MongoDB Shell Download | MongoDB 我选的zip包 3. 启动server 4. 启动shell, 完成

这样拼板帮你省近万元,堪称PCB工程师成本终结者!

别再被骗了&#xff0c;打PCB板价格高不是单价高&#xff01;而是你的拼板导致利用率太低了&#xff01; 今天给大家讲个小故事&#xff0c;教大家如何省钱...... 一个爽朗的晴天&#xff0c;我听闻同事说有客户对他吐槽打板子价格太高&#xff0c;说着说着就开始吹起了牛逼...…

Spring MVC的核心类和注解——@RequestMapping注解(三)请求映射方式

一、请求映射方式的分类 基于注解风格的Spring MVC&#xff0c;通过RequestMapping注解指定请求映射的URL路径。URL路径映射常用的方式有基于请求方式的URL路径映射、基于Ant风格的URL路径映射和基于REST风格的URL路径映射。接下来分别对这三种请求映射方式进行详细讲解。 a. …

受风头痛的几种情况

受风是指人体外感风邪引起的疾病&#xff0c;不同的病因需要采用相应的治疗方法进行调理和治疗。风为六淫之一&#xff0c;具有轻扬开泄的特性&#xff0c;易伤人肌表&#xff0c;引起头痛等症状。 中医认为头疼受风是由于外感引起的&#xff0c;头疼可以分为外感和内伤两个原…

【TB作品】体重监控系统,ATMEGA16单片机,Proteus仿真

机电荷2018级课程设计题目及要求 题1:电子称重器设计 功能要求: 1)开机显示时间(小时、分)、时分可修改; 2)用滑动变阻器模拟称重传感器(测量范围0- 200g),数码管显示当前重量值,当重量值高于高 值时,红灯长亮; 3)当重量值低于低值时,黄灯长亮; 4)当重量值在正常值时,绿灯亮; 5…