马尔科夫蒙特卡洛_吉布斯抽样算法(Markov Chain Monte Carlo(MCMC)_Gibbs Sampling)

ops/2024/9/23 22:38:40/

定义

输入:目标概率分布的密度函数 p ( x ) p(x) p(x),函数 f ( x ) f(x) f(x)

输出: p ( x ) p(x) p(x)的随机样本 x m + 1 , x m + 2 , ⋯ , x n x_{m+1},x_{m+2},\cdots,x_n xm+1,xm+2,,xn,函数样本均值 f m n f_{mn} fmn;

参数:收敛步数 m m m,迭代步数 n n n

(1)初始化。给出初始样本 x 0 = ( x 1 ( 0 ) , x 2 ( 0 ) , ⋯ , x k ( 0 ) ) T x^{0} = ( x_1^{(0)},x_2^{(0)},\cdots,x_k^{(0)} )^T x0=(x1(0),x2(0),,xk(0))T

(2)对i循环执行

设第 ( i − 1 ) (i-1) (i1)次迭代结束时的样本为 x ( i − 1 ) = ( x 1 ( i − 1 ) , x 2 ( i − 1 ) , ⋯ , x k ( i − 1 ) ) T x^{(i-1)} = (x_1^{(i-1)},x_2^{(i-1)},\cdots,x_k^{(i-1)})^T x(i1)=(x1(i1),x2(i1),,xk(i1))T,则第 i i i次迭代进行如下几步操作:

{ ( 1 ) 由满足条件分布 p ( x 1 ∣ x 2 ( i ) , ⋯ , x k ( i − 1 ) ) 抽取 x 1 ( i ) ⋮ ( j ) 由满足条件分布 p ( x j ∣ x 1 ( i ) , ⋯ , x j − 1 ( i ) , x j + 1 ( i ) , ⋯ , x k ( i − 1 ) ) 抽取 x j ( i ) ⋮ ( k ) 由满足条件分布 p ( x k ∣ x 1 ( i ) , ⋯ , x ( k − 1 ) ( i ) 抽取 x k ( i ) \begin{cases} (1)由满足条件分布p(x_1|x_2^{(i)},\cdots,x_k^{(i-1)})抽取x_1^{(i)}\\ \vdots \\ (j)由满足条件分布p(x_j|x_1^{(i)},\cdots,x_{j-1}^{(i)},x_{j+1}^{(i)},\cdots,x_k^{(i-1)})抽取x_j^{(i)} \\ \vdots \\ (k)由满足条件分布p(x_k|x_1^{(i)},\cdots,x_{(k-1)}^(i)抽取x_k^{(i)} \end{cases} (1)由满足条件分布p(x1x2(i),,xk(i1))抽取x1(i)(j)由满足条件分布p(xjx1(i),,xj1(i),xj+1(i),,xk(i1))抽取xj(i)(k)由满足条件分布p(xkx1(i),,x(k1)(i)抽取xk(i)

得到第 i i i次迭代值 x ( i ) = ( x 1 ( i ) , x 2 ( i ) , ⋯ , x k ( i ) ) T x^{(i)} = (x_1^{(i)},x_2^{(i)},\cdots,x_k^{(i)})^T x(i)=(x1(i),x2(i),,xk(i))T
(3)得到样本集合
{ x ( m + 1 ) , x ( m + 2 ) , ⋯ , x ( n ) } \{ x^{(m+1)},x^{(m+2)},\cdots,x^{(n)} \} {x(m+1),x(m+2),,x(n)}
(4)计算
f m n = 1 n − m ∑ i = m + 1 n f ( x ( i ) ) f_{mn} = \frac{1}{n-m}\sum_{i=m+1}^n f(x^{(i)}) fmn=nm1i=m+1nf(x(i))

import numpy as np
from matplotlib import pyplot as plt
from scipy.stats import gaussian_kdedef gibbs_sampling(dim, conditional_sampler, x0=None, burning_steps=1000, max_steps=10000, epsilon=1e-8, verbose=False):"""给定一个从p(x_j|x_1,x_2,…x_n)采样的条件采样器返回样本x~p的列表,其中p是条件分布的原始分布。x0是x的初始值。如果未指定,则将其设置为零向量。条件采样器将(x,j)作为参数"""x = np.zeros(dim) if x0 is None else x0samples = np.zeros([max_steps - burning_steps, dim])for i in range(max_steps):for j in range(dim):x[j]  = conditional_sampler(x, j)if verbose:print("New value of x is", x_new)if i >= burning_steps:samples[i - burning_steps] = xreturn samplesif __name__ == '__main__':i = 0def demonstrate(dim, p, desc, **args):samples = gibbs_sampling(dim, p, **args)z = gaussian_kde(samples.T)(samples.T)plt.scatter(samples[:, 0], samples[:, 1], c=z, marker='.')plt.plot(samples[: 100, 0], samples[: 100, 1], 'r-')plt.title(desc)plt.savefig(str(i)+".png")plt.show()# example 1:mean = np.array([2, 3])covariance = np.array([[1, 0],[0, 1]])covariance_inv = np.linalg.inv(covariance)det_convariance = 1def gaussian_sampler1(x, j):return np.random.normal()demonstrate(2, gaussian_sampler1, "Gaussian distribution with mean of 2 and 3")# example 2:mean = np.array([2, 3])covariance = np.array([[1, 0],[0, 1]])covariance_inv = np.linalg.inv(covariance)det_convariance = 1def gaussian_sampler2(x, j):if j == 0:return np.random.normal(2)else:return np.random.normal(3)demonstrate(2, gaussian_sampler2, "Gaussian distribution with mean of 2 and 3")# example 3:def blocks_sampler(x, j):sample = np.random.random()if sample > .5:sample += 1.return sampledemonstrate(2, blocks_sampler, "Four blocks")# example 4:def blocks_sampler(x, j):sample = np.random.random()if sample > .5:sample += 100.return sampledemonstrate(2, blocks_sampler, "Four blocks with large gap.")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/ops/114996.html

相关文章

rabbitmq整合skywalking并编写自定义插件增强

rabbitmq整合skywalking 首先先下载准备好skywalking 的服务端和ui控制台,java-agent https://skywalking.apache.org/downloads/ 整合skywalking 我的流程是在生产者和消费者服务中去引入一个mq的sdk,具体SDK的内容可以查看这篇文章 在sdk的pom文件…

信息技术的快速发展与未来展望

信息技术的快速发展与未来展望 近年来,信息技术(IT)的迅猛发展给全球经济、社会和个人生活带来了深刻的变革。无论是大数据、云计算,还是人工智能、物联网等技术,IT技术的进步正不断推动着各行各业的数字化转型。本文…

Antd框架中的Select组件placeholder不显示

官方是这样说的&#xff1a; placeholder 只有在 value undefined 才会显示&#xff0c;对于其它的 null、0、 等等对于 JS 语言都是有意义的值。 所以原本我的代码是这样的,这样写placeholder的值是不会显示的 <template> <a-form-itemlabel"所属门店"na…

JavaScript可视化

引言 随着大数据时代的到来&#xff0c;数据可视化成为了信息表达和知识发现的重要手段。JavaScript&#xff0c;凭借其广泛的浏览器支持、强大的交互能力以及丰富的生态系统&#xff0c;成为了数据可视化领域的重要工具。无论是前端开发中的数据图表展示&#xff0c;还是更高…

STM32的GPIO的八种工作模式

GPIO八种工作模式的简介 GPIO八种工作模式特点及应用输入浮空输入用&#xff0c;完全浮空&#xff0c;状态不定输入上拉输入用&#xff0c;用内部上拉&#xff0c;默认是高电平输入下拉输入用&#xff0c;用内部下拉&#xff0c;默认是低电平模拟功能ADC&#xff0c;DAC开漏输…

MySQL:事务隔离级别

SQL 标准定义了四个隔离级别&#xff1a; READ-UNCOMMITTED(读取未提交) &#xff1a;最低的隔离级别&#xff0c;允许读取尚未提交的数据变更&#xff0c;可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读取已提交) &#xff1a;允许读取并发事务已经提交的数据&#xf…

HTML贪吃蛇游戏

文章目录 贪吃蛇游戏 运行效果注意代码 贪吃蛇游戏 贪吃蛇是一款经典的休闲益智游戏。本文将通过HTML5和JavaScript详细解析如何实现一个简易版的贪吃蛇游戏。游戏的主要逻辑包括蛇的移动、碰撞检测、食物生成等功能。以下是游戏的完整代码及注释解析。&#xff08;纯属好玩&a…

安全带检测系统源码分享

安全带检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…