R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样

article/2025/9/19 10:29:36

创建测试数据

第一步,我们创建一些测试数据,用来拟合我们的模型。我们假设预测变量和因变量之间存在线性关系,所以我们用线性模型并添加一些噪音。

trueA <- 5trueB <- 0trueSd <- 10sampleSize <- 31# 创建独立的x值x <- (-(sampleSize-1)/2):((sampleSize-1)/2)# 根据ax + b + N(0,sd)创建因变量
y <-  trueA * x + trueB + rnorm(n=sampleSize,mean=0,sd=trueSd)plot(x,y, main="Test Data")

定义统计模型

下一步是指定统计模型。我们已经知道数据是用x和y之间的线性关系y = a * x + b和带有标准差sd的正态误差模型N(0,sd)创建的,所以让我们使用相同的模型进行拟合,看看如果我们可以检索我们的原始参数值。

从模型中导出似然函数

为了估计贝叶斯分析中的参数,我们需要导出我们想要拟合的模型的似然函数。似然函数是我们期望观察到的数据以我们所看到的模型的参数为条件发生的概率(密度)。因此,鉴于我们的线性模型y = b + a*x + N(0,sd)将参数(a, b, sd)作为输入,我们必须返回在这个模型下获得上述测试数据的概率(这听起来比较复杂,正如你在代码中看到的,我们只是计算预测值y = b + a*x与观察到的y之间的差异,然后我们必须查找这种偏差发生的概率密度(使用dnorm)。

likelihood <- function(param){a = param[1]b = param[2]sd = param[3]pred = a*x + bsumll = sum(singlelikelihoods)(sumll)  }slopevalues <- function(x){return(likelihood(c(x, trueB, trueSd)))}

斜率参数对数似然曲线

作为说明,代码的最后几行绘制了斜率参数a的一系列参数值的似然函数。

为什么我们使用对数

您注意到结果是似然函数中概率的对数,这也是我对所有数据点的概率求和的原因(乘积的对数等于对数之和)。我们为什么要做这个? 因为很多小概率乘以的可能性很快就会变得非常小(比如10 ^ -34)。在某些阶段,计算机程序存在数字四舍五入的问题。 

定义先验

第二步,与贝叶斯统计中一样,我们必须为每个参数指定先验分布。为了方便起见,我对所有三个参数使用了均匀分布和正态分布。 无信息先验通常是1 / sigma(如果你想了解原因,请看这里)。 

#先验分布prior <- function(param){a = param[1]b = param[2]sd = param[3]aprior =  (a, min=0, max=10, log = T)bprior = dnorm(b, sd = 5, log = T)}

 后验

先验和似然性的乘积是MCMC将要处理的实际数量。这个函数被称为后验 。同样,在这里我们使用加总,因为我们使用对数。

posterior <- function(param){return ( (param) + prior(param))}

 MCMC

接下来是Metropolis-Hastings算法。该算法最常见的应用之一(如本例所示)是从贝叶斯统计中的后验密度中提取样本。然而,原则上,该算法可用于从任何可积函数中进行采样。因此,该算法的目的是在参数空间中跳转,但是以某种方式使得在某一点上的概率与我们采样的函数成比例(这通常称为目标函数)。在我们的例子中,这是上面定义的后验。

这是通过

  1. 从随机参数值开始
  2. 根据称为提议函数的某个概率密度,选择接近旧值的新参数值
  3. 以概率p(新)/ p(旧)跳到这个新点,其中p是目标函数,p> 1表示跳跃

当我们运行这个算法时,它访问的参数的分布会收敛到目标分布p。那么,让我们在R中得到 :

########Metropolis算法# ################proposalfunction <- function(param){return(rnorm(3,mean = param, sd= c(0.1,0.5,0.3)))}run_metropolis_MCMC <- function(startvalue, iterations){for (i in 1:iterations){if (runif(1) < probab){chain[i+1,] = proposal}else{chain[i+1,] = chain[i,]}}return(chain)}chain = run_metropolis_MCMC(startvalue, 10000)burnIn = 5000acceptance = 1-mean(duplicated(chain[-(1:burnIn),]))

使用后验的对数可能在开始时有点混乱,特别是当您查看计算接受概率的行时(probab = exp(后验分布(提议分布) - 后验(链[i,])) )。要理解我们为什么这样做,请注意p1 / p2 = exp [log(p1)-log(p2)]。

算法的第一步可能受初始值的偏差,因此通常被丢弃用于进一步分析 。要看的一个有趣的输出是接受率: 接受标准拒绝提议的频率是多少?接受率可以受提议函数的影响:通常,提议越接近,接受率越大。然而,非常高的接受率通常是无益的:这意味着算法“停留”在同一点 。可以证明,20%到30%的接受率对于典型应用来说是最佳的 。

###概要#######################par(mfrow = c(2,3))hist( [-(1:burnIn),1],nclass=30, , main="Posterior of a", xlab="True value = red line" )abline(v = mean(chain[-(1:burnIn),1]))#进行比较:summary(lm(y~x))

所得到的图应该看起来像下面的图。你看到我们检索到了或多或少用于创建数据的原始参数,你还看到我们在最高后验值周围得到了一定的区域,这些后验值也有一些数据,这相当于贝叶斯的置信区间。

图:上排显示斜率(a)的后验估计,截距(b)和误差的标准偏差(sd)。下一行显示马尔可夫链参数值。


http://chatgpt.dhexx.cn/article/O9oTWPCA.shtml

相关文章

马尔科夫过程与吉布斯采样

随机模拟(或者统计模拟)方法有一个很酷的别名是蒙特卡罗方法(Monte Carlo Simulation)。这个方法的发展始于20世纪40年代&#xff0c;和原子弹制造的曼哈顿计划密切相关&#xff0c;当时的几个大牛&#xff0c;包括乌拉姆、冯.诺依曼、费米、费曼、Nicholas Metropolis&#xf…

吉布斯采样的简单描述

几个可以学习gibbs sampling的方法1&#xff0c;读Bishop的Pattern Recognition and Machine Learning&#xff0c;讲的很清楚&#xff0c;但是我记得好像没有例子。2&#xff0c;读artificial Intelligence&#xff0c;2、3版&#xff0c;都有。但是我没读过。3&#xff0c;最…

【ML】线性回归的吉布斯采样(Gibbs Sampling)实现(python)

导航 Bayesian Linear RegressionGibbs SamplingDerving a Gibbs samplerUpdate for β 0 \beta_0 β0​Update for β 1 \beta_1 β1​Update for τ \tau τSynthetic dataGibbs sampler code downlaodReferences Bayesian Linear Regression 考虑只有一个自变量(indepen…

【机器学习】主题建模+隐狄利克雷分配模型(LDA)+吉布斯采样

【主题建模】 大数据时代&#xff0c;面对海量的数据&#xff0c;如果能知道它的主题是什么&#xff0c;从数据压缩的角度来看&#xff0c;我们可以通过很少量的主题来管理很大亮的文档数据集合&#xff0c;从而实现一个比较简洁的操作和管理文档集合的目的&#xff1b;除此之外…

【人工智能】对贝叶斯网络进行吉布斯采样

问题 现要求通过吉布斯采样方法&#xff0c;利用该网络进行概率推理&#xff08;计算 P(RT|SF, WT)、P2(CF|WT)的概率值&#xff09;。 原理 吉布斯采样的核心思想为一维一维地进行采样&#xff0c;采某一个维度的时候固定其他的维度&#xff0c;在本次实验中&#xff0c;假…

matlab bnt工具箱吉布斯采样,吉布斯采样——原理及matlab实现

原文来自:https://victorfang.wordpress.com/2014/04/29/mcmc-the-gibbs-sampler-simple-example-w-matlab-code/ 【注】评论区有同学指出译文理论编码有误,请参考更官方的文献,个人当时仅验证过红色字体部分理论与维基百科中二位随机变量吉布斯采样的结果是否对应,其余部分…

【LDA】吉布斯采样

吉布斯采样是用条件概率得到联合概率分布。 其实是得到我们想要东西的近似解 目录 1 蒙特卡罗2 马尔科夫链3.MCMC采样4 MH采样5 吉布斯采样 1 蒙特卡罗 蒙特卡洛方法是为了解决一些不太好求解的求和或者积分问题。 其实就是一个近似方法&#xff0c;通过采样的多个样本代替原…

机器学习笔记之马尔可夫链蒙特卡洛方法(四)吉布斯采样

机器学习笔记之马尔可夫链蒙特卡洛方法——吉布斯采样 引言回顾&#xff1a;MH采样算法基于马尔可夫链的采样方式细致平衡原则与接收率 MH采样算法的弊端吉布斯采样方法吉布斯采样的采样过程吉布斯采样的推导过程吉布斯采样的代码实现 引言 上一节介绍了将马尔可夫链与蒙特卡洛…

三步完成吉布斯采样Gibbs sampling

吉布斯采样的具体执行过程只需要三个步骤&#xff0c;非常非常简单好理解&#xff0c;其它相关的背景知识能帮助加深理解。 一、Preliminaries Monte Carlo methods 它是很宽泛的一类计算方法&#xff0c;依赖重复的随机采样去获得数值结果。a broad class of computational a…

MCMC笔记:吉布斯采样(Gibbs)

1 介绍 吉布斯采样是一种特殊的MH采样 MCMC笔记Metropilis-Hastings算法&#xff08;MH算法&#xff09;_UQI-LIUWJ的博客-CSDN博客 此时我们要采样的分布是一个高维的情况 吉布斯采样的思想就是一维一维地进行采样&#xff0c;采某一个维度的时候固定其他的维度 吉布斯采…

吉布斯采样

回顾一下MC 采样&#xff1a; f(x)是已知 的概率分布函数&#xff0c;现在 找到一系列的x服从这个概率分布。也就是在f(x&#xff09;当中抽取一些样本x。后来就提出了&#xff1a; F(x)是f(x)的累积概率分布&#xff0c;只需 在0到1上均匀采样得到i&#xff0c;然后将这个样本…

随机采样和随机模拟:吉布斯采样Gibbs Sampling

http://blog.csdn.net/pipisorry/article/details/51373090 吉布斯采样算法详解 为什么要用吉布斯采样 通俗解释一下什么是sampling。 sampling就是以一定的概率分布&#xff0c;看发生什么事件。举一个例子。甲只能E&#xff1a;吃饭、学习、打球&#xff0c;时间T&#xff1a…

吉布斯抽样

吉布斯采样是生成马尔科夫链的一种方法&#xff0c;生成的马尔科夫链可以用来做蒙特卡洛仿真&#xff0c;从而求得一个较复杂的多元分布。 吉布斯采样的具体做法&#xff1a;假设有一个k维的随机向量&#xff0c;现想要构造一条有n个样本的k维向量&#xff08;n样本马尔科夫序列…

从马尔科夫过程到吉布斯采样(附程序示例)

目标&#xff1a;如何采取满足某个概率分布的一组数据&#xff0c;比如如何给出满足标准正太分布的1000个点&#xff0c;当然该分布比较简单&#xff0c;生成满足此分布的1000个点并不难&#xff0c;对matlab&#xff0c;python 等都是一行语句的事&#xff0c;但是如果是一个不…

sqlloader导出数据指定分隔符_来一份数据库全家桶~

♫. ♪ ~ ♬..♩~ ♫. ♪..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩♫. ♪ ~ ♬..♩~ ♫. ♪..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩ 点击蓝字关注我们♫. ♪ ~ ♬..♩~ ♫. ♪..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩..…

使用sqlloader导入数据(千万级)-oracle

前言&#xff1a;笔者业务场景&#xff1a;当前表无分区&#xff0c;需将数据导出&#xff0c;创建分区后&#xff0c;重新导入当前表&#xff1b;当然&#xff0c;该方法同样使用于普通的数据迁移&#xff0c;或新旧表数据同步&#xff08;表结构一致&#xff09; 一、涉及数…

oracle-sqlloader的简单使用

目录 使用场景 简单使用 编写ctl文件 执行命令 使用场景 当你拿到一个txt文件&#xff0c;里面的数据是用统一符号分割的&#xff0c;例如如下文件&#xff0c;就可以考虑使用sqlloader导入到oracle数据库。 简单使用 编写ctl文件 OPTIONS (skip1,rows128) -- sqlldr 命…

使用Sqlloader处理数据

Oracle数据导出工具sqluldr2可以将数据以csv、txt等文件格式导出&#xff0c;适用于大批量数据的导出&#xff0c;导出速度非常快&#xff0c;导出后可以使用Oracle SQL Loader工具将数据导入到数据库中。下面将介绍Sqluldr2和sqlldr在Windows平台下的数据处理过程。 一、获取…

oracle之sqlloader

oracle的sqlloader可以从文件批量的将数据插入到数据库中&#xff0c;避免了使用SQL一句一句插入给数据库带来的压力。在工作中&#xff0c;简单的使用了一下&#xff0c;并没有深入的研究&#xff0c;下面是一个例子。 ① 数据文件信息&#xff1a; tina&#xff0c;12,34…

oracle sqlloader 的简单使用

1、EMP1 建表语句&#xff1a; CREATE TABLE EMP1 (EMPNO NUMBER(8) NOT NULL,ENAME VARCHAR2(10),HIREDATE DATE,JOB VARCHAR2(20),SAL NUMBER(8),DEPTNO NUMBER(8) NOT NULL ); 2、test.txt 数据文件&#xff1a; 1|Abandon1|2022-02-01|销售人员1|2500…