利用MCMC 获得泊松分布

P_n=\frac{\lambda^nexp(-\lambda)}{n!},n=0,1,2,...

X\sim P(\lambda),E(X)=\sqrt{D(X)}=\lambda


  • 写出概率流方程如下
        if state == 0:            
            if np.random.random() <= min([Lambda/2, 1]):
                state = 1
            else:
                pass
                
        elif state == 1:
            if choose_prob_state[i] <= 0.5:
                #选择 1 -> 0,此时的接受概率为min[2/Lambda, 1]
                if np.random.random() <= min([2/Lambda, 1]):
                    state = 0
                else:
                    pass
            else:
                #选择 1 -> 2,此时接受概率为 min[Lambda/(n+1), 1]
                if np.random.random() <= min([Lambda/(state+1), 1]):
                    state = 2
                else:
                    pass

        elif state >= 2:
            if choose_prob_state[i] <= 0.5:
                #选择 n -> n+1,此时接受概率为 min[Lambda/(n+1), 1]
                if np.random.random() <= min([Lambda/(state+1), 1]):
                    state = state + 1
                else:
                    pass
            else:
                #选择 n+1 > n,此时接受概率为 min[(n+1)/Lambda, 1]
                if np.random.random() <= min([(state)/Lambda, 1]):
                    state = state - 1
                else:
                    pass

  • blocking 方法
def block_averages(data, block_size):
    num_blocks = len(data) // block_size
    blocks = data[:num_blocks*block_size].reshape(num_blocks, block_size)
    block_avgs = blocks.mean(axis=1)
    return block_avgs

block_mean = []
block_std  = []

for i in range(1, 201):
    block_size = 5 * i

    block_avgs = block_averages(results, block_size)

    mean_estimate = np.mean(block_avgs)
    standard_error = np.std(block_avgs, ddof=1) / np.sqrt(len(block_avgs))

    block_mean.append(mean_estimate)
    block_std.append(standard_error)

  • Lambda = 1 生成效果

average time: 1.072e-06
ave: 0.9996688
std: 1.00027000870093
(array([3.681131e+06, 3.678446e+06, 1.837276e+06, 6.127200e+05,
       1.533770e+05, 3.116400e+04, 5.095000e+03, 7.020000e+02,
       8.300000e+01, 6.000000e+00]), array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]), <BarContainer object of 10 artists>)

  • blocking method 

  • 随着block 增大 稳定效果显著

  • Lambda = 7

average time: 1.153e-06
ave: 7.0095212
std: 2.6496322285839153
(array([9.062000e+03, 6.352700e+04, 2.216480e+05, 5.190980e+05,
       9.097340e+05, 1.274978e+06, 1.487161e+06, 1.487430e+06,
       1.304976e+06, 1.016897e+06, 7.126600e+05, 4.541560e+05,
       2.646540e+05, 1.432550e+05, 7.228000e+04, 3.374700e+04,
       1.474600e+04, 6.073000e+03, 2.455000e+03, 9.640000e+02,
       3.790000e+02, 9.900000e+01, 1.700000e+01, 4.000000e+00]), array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,
       13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24.]), <BarContainer object of 24 artists>)
 



  • 完整代码
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(20)
import copy
import time

##pn = \lambda^n * exp(-\lambda)/n!

def poidis(Lambda, num, init=0):
    random_list = np.zeros(num)
    state = init
    max_state = init
    random_list[0] = state

    choose_prob_state = np.random.random(num)
    
    for i in range(1, num):
        if state == 0:            
            if np.random.random() <= min([Lambda/2, 1]):
                state = 1
            else:
                pass
                
        elif state == 1:
            if choose_prob_state[i] <= 0.5:
                #选择 1 -> 0,此时的接受概率为min[2/Lambda, 1]
                if np.random.random() <= min([2/Lambda, 1]):
                    state = 0
                else:
                    pass
            else:
                #选择 1 -> 2,此时接受概率为 min[Lambda/(n+1), 1]
                if np.random.random() <= min([Lambda/(state+1), 1]):
                    state = 2
                else:
                    pass

        elif state >= 2:
            if choose_prob_state[i] <= 0.5:
                #选择 n -> n+1,此时接受概率为 min[Lambda/(n+1), 1]
                if np.random.random() <= min([Lambda/(state+1), 1]):
                    state = state + 1
                else:
                    pass
            else:
                #选择 n+1 > n,此时接受概率为 min[(n+1)/Lambda, 1]
                if np.random.random() <= min([(state)/Lambda, 1]):
                    state = state - 1
                else:
                    pass
        else:
            print("undefined state!")
            break
        
        random_list[i] = copy.deepcopy(state)
        if max_state < state:
            max_state = copy.deepcopy(state)
            
    return random_list, max_state

num = int(1e7)
start = time.time()
results, max_state = poidis(7, num)
end = time.time()
print("average time:", round((end-start)/num, 9))

hist_doc = plt.hist(results, bins=[i for i in range(max_state+2)])
print("ave:", np.average(results))
print("std:", np.std(results))
print(hist_doc)

plt.show()

def block_averages(data, block_size):
    num_blocks = len(data) // block_size
    blocks = data[:num_blocks*block_size].reshape(num_blocks, block_size)
    block_avgs = blocks.mean(axis=1)
    return block_avgs

block_mean = []
block_std  = []

for i in range(1, 201):
    block_size = 5 * i

    block_avgs = block_averages(results, block_size)

    mean_estimate = np.mean(block_avgs)
    standard_error = np.std(block_avgs, ddof=1) / np.sqrt(len(block_avgs))

    block_mean.append(mean_estimate)
    block_std.append(standard_error)
    
plt.scatter(range(1, 201), block_std, s=2)
plt.show()


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32USART+DMA实现不定长数据接收/发送

STM32USARTDMA实现不定长数据接收 CubeMX配置代码分享实践结果 这一期的内容是一篇代码分享&#xff0c;CubeMX配置介绍&#xff0c;关于基础的内容可以往期内容 夜深人静学32系列11——串口通信夜深人静学32系列18——DMAADC单/多通道采集STM32串口重定向/实现不定长数据接收 …

『PyTorch学习笔记』分布式深度学习训练中的数据并行(DP/DDP) VS 模型并行

分布式深度学习训练中的数据并行(DP/DDP) VS 模型并行 文章目录 一. 介绍二. 并行数据加载2.1. 加载数据步骤2.2. PyTorch 1.0 中的数据加载器(Dataloader) 二. 数据并行2.1. DP(DataParallel)的基本原理2.1.1. 从流程上理解2.1.2. 从模式角度理解2.1.3. 从操作系统角度看2.1.…

【ESP32】手势识别实现笔记:红外温度阵列 | 双三次插值 | 神经网络 | TensorFlow | ESP-DL

目录 一、开发环境搭建与新建工程模板1.1、开发环境搭建与卸载1.2、新建工程目录1.3、自定义组件 二、驱动移植与应用开发2.1、I2C驱动移植与AMG8833应用开发2.2、SPI驱动移植与LCD应用开发2.3、绘制温度云图2.4、启用PSRAM&#xff08;可选&#xff09;2.5、画面动静和距离检测…

力扣:1419. 数青蛙

题目&#xff1a; 代码&#xff1a; class Solution { public:int minNumberOfFrogs(string croakOfFrogs){string s "croak";int ns.size();//首先创建一个哈希表来标明每个元素出现的次数&#xff01;vector<int>hash(n); //不用真的创建一个hash表用一个数…

事务--02---TCC模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 TCC模式两阶段提交 的模型 1.流程分析阶段一&#xff08; Try &#xff09;&#xff1a;阶段二&#xff08;Confirm)&#xff1a;阶段二(Canncel)&#xff1a; 2.事…

java编程:⼀个⽂件中存储了本站点下各路径被访问的次数,请编程找出被访问次数最多的10个路径

题目 编程题&#xff1a;⼀个⽂件&#xff08;url_path_statistics.txt&#xff09;中存储了本站点下各路径被访问的次数 请编程找出被访问次数最多的10个路径时间复杂是多少&#xff0c;是否可以优化&#xff08;假设路径数量为n&#xff09;如果路径访问次数⽂件很⼤&#x…

unity3d模型中缺失animation

在 模型的Rig-Animationtype 设置成Legacy https://tieba.baidu.com/p/2293580178

解决WPS拖动整行的操作

如上图&#xff0c;想要把第4行的整行内容&#xff0c;平移到第1行。 1.选中第4行的整行 2.鼠标出现如图的样子时&#xff0c;按住鼠标左键&#xff0c;上移到第1行位置后&#xff0c;放开左键即可。

vue项目和wx小程序

wx:key 的值以两种形式提供&#xff1a; 1、字符串&#xff0c;代表在 for 循环的 array 中 item 的某个 property&#xff0c;该 property 的值需要是列表中唯一的字符串或数字&#xff0c;且不能动态改变。 2、保留关键字 this 代表在 for 循环中的 item 本身&#xff0c;这种…

测试与管理 Quota

用myquota1创建一个大的文件测试 理论猜想&#xff1a;超过soft可以&#xff0c;但是超过hard就不行了&#xff0c;最大值就是hard&#xff0c;如果超过soft&#xff0c;过了17天不处理&#xff0c;最后限制值会被强制设置成soft。修改设置成hard值 切换测试用户&#xff0c;m…

易宝OA ExecuteSqlForSingle SQL注入漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台&#xff0c;具有信息管理、 流程管理 、知识管理&#xff08;档案和业务管理&#xff09;、协同办公等多种功能。 0x02 漏洞概述 易宝OA ExecuteSqlForSingle接口处存在SQL注入漏洞&a…

苹果TF签名全称TestFlight签名,需要怎么做才可以上架呢?

如果你正在开发一个iOS应用并准备进行内测&#xff0c;TestFlight是苹果提供的一个免费的解决方案&#xff0c;它使开发者可以邀请用户参加应用的测试。以下是一步步的指南&#xff0c;教你如何利用TestFlight进行内测以便于应用后续可以顺利上架App Store。 1: 准备工作 在测…

项目设计---网页五子棋

文章目录 一. 项目描述二. 核心技术三. 需求分析概要设计四. 详细设计4.1 实现用户模块4.1.1 约定前后端交互接口4.1.2 实现数据库设计4.1.3 客户端页面展示4.1.4 服务器功能实现 4.2 实现匹配模块4.2.1 约定前后端交互接口4.2.2 客户端页面展示4.2.3 服务器功能实现 4.3 实现对…

2023年计网408

第33题 33.在下图所示的分组交换网络中&#xff0c;主机H1和H2通过路由器互连&#xff0c;2段链路的带宽均为100Mbps、 时延带宽积(即单向传播时延带宽)均为1000bits。若 H1向 H2发送1个大小为 1MB的文件&#xff0c;分组长度为1000B&#xff0c;则从H1开始发送时刻起到H2收到…

Windows系列:windows2003-建立域

windows2003-建立域 Active Directory建立DNS建立域查看日志xp 加入域 Active Directory 活动目录是一个包括文件、打印机、应用程序、服务器、域、用户账户等对象的数据库。 常见概念&#xff1a;对象、属性、容器 域组件&#xff08;Domain Component&#xff0c;DC&#x…

如何在Docker环境下安装Firefox浏览器并结合内网穿透工具实现公网访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

信贷销售经理简历模板

这份简历内容&#xff0c;以信贷销售经理招聘需求为背景&#xff0c;我们制作了1份全面、专业且具有参考价值的简历案例&#xff0c;大家可以灵活借鉴。 信贷销售经理简历模板在线编辑下载&#xff1a;百度幻主简历 求职意向 求职类型&#xff1a;全职 意向岗位&#xff…

TQ2440开发板-LED全亮全灭控制程序设计

目录 什么是GPIOS3C2440的GPIO访问和控制方式&#xff1a;3种寄存器 TQ2440的LED灯底板原理图---LED测试部分核心板原理图----GPIO部分 LED控制---设计思想整体代码 && 代码研读配置GPIO端口为输出模式控制LED的全亮和全灭 真就是从零学起。 什么是GPIO GPIO&#xff…

软件设计师——计算机网络(一)

&#x1f4d1;前言 本文主要是【计算机网络】——软件设计师计算机网络的题目&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

Linux:进程间通信

目录 一、关于进程间通信 二、管道 pipe函数 管道的特点 匿名管道 命名管道 mkfifo 三、system v共享内存 shmget函数(创建) ftok函数(生成key) shmctl函数(删除) shmat/dt函数(挂接/去关联) 四、初识信号量 一、关于进程间通信 首先我们都知道&#xff0c;进程运…