【视频】马尔可夫链蒙特卡罗方法MCMC原理与R语言实现|数据分享(上)

简介: 【视频】马尔可夫链蒙特卡罗方法MCMC原理与R语言实现|数据分享

原文链接:http://tecdat.cn/?p=2687


在贝叶斯方法中,马尔可夫链蒙特卡罗方法尤其神秘。它们肯定是数学繁重且计算量大的过程,但它们背后的基本推理,就像数据科学中的许多其他东西一样,可以变得直观。这就是我的目标。


那么,什么是马尔可夫链蒙特卡罗(MCMC)方法?简短的回答是:

MCMC 方法用于通过概率空间中的随机抽样来近似感兴趣参数的后验分布。


在这篇文章中,我将解释这个简短的答案。

首先,一些术语。感兴趣的参数只是总结我们感兴趣的现象的一些数字。通常我们使用统计数据来估计参数。例如,如果我们想了解成年人的身高,我们感兴趣的参数可能是平均身高。分布是我们参数的每个可能值的数学表示,以及我们观察每个值的可能性。最著名的例子是钟形曲线:


在贝叶斯统计方法中,分布有额外的解释。贝叶斯不仅表示参数的值以及每个参数成为真实值的可能性,而是将分布视为描述我们对参数的信念。因此,上面的钟形曲线表明我们非常确定参数的值非常接近于零,但我们认为真实值高于或低于该值的可能性相同,直到某个点。

碰巧的是,人类身高确实遵循正态曲线,所以假设我们相信人类平均身高的真实值遵循如下钟形曲线:


显然,这张图所代表的有信仰的人多年来一直生活在巨人中间,因为据他们所知,最有可能的成人平均身高是1米8(但他们并不是特别自信)。

让我们想象一下这个人去收集了一些数据,他们观察了1米6到 1米8之间的人群。我们可以在下面表示该数据,以及另一条显示人类平均身高值最能解释数据的正态曲线:


在贝叶斯统计中,代表我们对参数的信念的分布称为先验分布,因为它在看到任何数据之前捕获了我们的信念。似然分布通过表示一系列参数值以及每个参数解释我们正在观察的数据的可能性来总结观察到的数据告诉我们的内容。估计最大化似然分布的参数值只是回答了这个问题:什么参数值最有可能观察到我们观察到的数据?在没有先验信念的情况下,我们可能会止步于此。

然而,贝叶斯分析的关键是结合先验分布和似然分布来确定后验分布。这告诉我们,考虑到我们先前的信念,哪些参数值可以最大限度地提高观察我们所做的特定数据的机会。在我们的例子中,后验分布如下所示:


上图,红线代表后验分布。您可以将其视为先验分布和似然分布的一种平均值。由于先验分布更短且分布更广,因此它代表了一组对人类平均身高的真实值“不太确定”的信念。同时,似然总结了相对狭窄范围内的数据,因此它代表了对真实参数值的“更确定”的猜测。

当先验可能性结合起来时,数据(由可能性表示)支配了在巨人中长大的假设个人的弱先验信念。尽管那个人仍然认为人类的平均身高比数据告诉他的要高一些,但他基本上相信数据。

在两条钟形曲线的情况下,求解后验分布非常容易。有一个简单的公式可以将两者结合起来。但是,如果我们的先验分布和似然分布没有那么好怎么办?有时,使用没有方便形状的分布对我们的数据或我们的先验信念进行建模是最准确的。如果我们的概率最好由具有两个峰值的分布来表示,并且出于某种原因我们想要解释一些非常古怪的先验分布怎么办?我通过手绘一个丑陋的先验分布来可视化下面的场景:


和以前一样,存在一些后验分布,它给出了每个参数值的可能性。但它有点难以看出它可能是什么样子,并且不可能通过分析来解决。

MCMC 方法

MCMC 方法允许我们估计后验分布的形状,以防我们无法直接计算它。回想一下,MCMC 代表马尔可夫链蒙特卡罗方法。为了理解它们是如何工作的,我将介绍蒙特卡罗模拟。

蒙特卡罗模拟只是一种通过重复生成随机数来估计固定参数的方法。通过获取生成的随机数并对它们进行一些计算,蒙特卡洛模拟提供了一个参数的近似值。


假设我们想估计圆的面积:


由于圆在边长为 1的正方形内,因此面积可以很容易地计算为 0.785 。但是,我们可以在正方形内随机放置 20 个点。然后我们计算落在圆圈内的点的比例,并将其乘以正方形的面积。这个数字是圆面积的一个很好的近似值。


由于 20 个点中有 15 个位于圆内,因此该圆看起来约为 0.75 。对于只有 20 个随机点的蒙特卡洛模拟来说还不错。

蒙特卡罗模拟不仅用于估计困难形状的区域。通过生成大量随机数,它们可用于对非常复杂的过程进行建模。

有了蒙特卡罗模拟和马尔可夫链的一些知识,我希望对 MCMC 方法如何工作的无数学解释非常直观。

回想一下,我们正在尝试估计我们感兴趣的参数的后验分布,即人类平均身高:


我不是可视化专家,显然我也不擅长将我的示例保持在常识范围内:我的后验分布示例严重高估了人类的平均身高。

我们知道后验分布在我们的先验分布和似然分布的范围内,但无论出于何种原因,我们都无法直接计算它。使用 MCMC 方法,我们将有效地从后验分布中抽取样本,然后计算统计数据,例如抽取样本的平均值。

首先,MCMC 方法选择一个随机参数值来考虑。模拟将继续生成随机值(这是蒙特卡洛部分),但要遵守一些规则来确定什么是好的参数值。诀窍是,对于一对参数值,可以通过计算每个值解释数据的可能性来计算哪个是更好的参数值,给定我们的先验信念。如果随机生成的参数值比上一个更好,则以一定的概率将其添加到参数值链中,该概率取决于它的好坏程度(这是马尔可夫链部分)。

为了直观地解释这一点,让我们回想一下某个值的分布高度代表观察该值的概率。因此,我们可以认为我们的参数值(x 轴)展示了高概率和低概率的区域,显示在 y 轴上。对于单个参数,MCMC 方法从沿 x 轴随机采样开始:


红点是随机参数样本

由于随机样本受固定概率的影响,它们往往会在一段时间后收敛于我们感兴趣的参数的最高概率区域:


蓝点仅代表任意时间点之后的随机样本,此时预计会发生收敛。注意:垂直堆叠点纯粹是为了说明目的。

收敛后,MCMC 采样会产生一组点,这些点是来自后验分布的样本。围绕这些点绘制直方图,并计算您喜欢的任何统计数据:


在 MCMC 模拟生成的样本集上计算的任何统计量都是我们对真实后验分布统计量的最佳猜测。

MCMC 方法也可用于估计多个参数(例如人的身高和体重)的后验分布。对于n 个参数,在 n 维空间中存在高概率区域,其中某些参数值集可以更好地解释观察到的数据。因此,我认为 MCMC 方法是在概率空间内随机抽样以近似后验分布。


点击标题查阅往期内容


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


01

02

03

04


什么是MCMC,什么时候使用它?


MCMC只是一个从分布抽样的算法。

这只是众多算法之一。这个术语代表“马尔可夫链蒙特卡洛”,因为它是一种使用“马尔可夫链”(我们将在后面讨论)的“蒙特卡罗”(即随机)方法。MCMC只是蒙特卡洛方法的一种,尽管可以将许多其他常用方法看作是MCMC的简单特例。


我为什么要从分布中抽样?


从分布中抽取样本是解决一些问题的最简单的方法。

可能MCMC最常用的方法是从贝叶斯推理中的某个模型的后验概率分布中抽取样本。通过这些样本,你可以问一些问题:“参数的平均值和可信度是多少?”。

如果这些样本查看文末了解数据获取方式是来自分布的独立样本,则 估计均值将会收敛在真实均值上。

假设我们的目标分布是一个具有均值m和标准差的正态分布s。

作为一个例子,考虑用均值m和标准偏差s来估计正态分布的均值(在这里,我将使用对应于标准正态分布的参数):

我们可以很容易地使用这个rnorm 函数从这个分布中抽样

seasamples<-rn 000,m,s)

样本的平均值非常接近真实平均值(零):

mean(sa es)
 ## \[1\] -0. 537

事实上,在这种情况下,n n 样本估计的预期方差是1/n 1 / n ,所以我们预计大部分值在$ \ pm 2 \,/ \ sqrt {n} = 0.02 。

summary(re 0,mean(rnorm(10000,m,s))))
 ## Min. 1st Qu. Median Mean 3rd Qu. Max. 
## -0.03250 -0.00580 0.00046 0.00042 0.00673 0.03550

这个函数计算累积平均值之和。

cummean<-fun msum(x)/seq_along(x)
 plot(cummaaSample",ylab="Cumulative mean",panel.aabline(h=0,col="red"),las=1)

将x轴转换为对数坐标并显示另外30个随机方法:

可以从您的一系列采样点中抽取样本分位数。

这是分析计算的点,其概率密度的2.5%低于:

p<-0.025a.true<-qnorm(p,m,s)a.true1## \[1\] -1.96

我们可以通过在这种情况下的直接整合来估计这个

aion(x)dnorm(x,m,s)
g<-function(a)integrate(f,-Inf,a)$valuea.int<-uniroot(function(x)g(a10,0))$roota.int1## \[1\] -1.96

并用Monte Carlo积分估计点:

a.mc<-unnasamples,p))a.mc## 1

1 -2.023 a. true- a.mc ## 1

1 0.06329

但是,在样本量趋于无穷大的极限内,这将会收敛。此外,有可能就错误的性质作出陈述; 如果我们重复采样过程100次,那么我们得到一系列与均值附近的误差相同幅度的误差的估计:

a.mc<-replicate(anorm(10000,m,s),p))
summary(a.true-a.mc)
## Min. 1st Qu. Median Mean 3rd Qu. Max. ## -0.05840 -0.01640 -0.00572 -0.00024 0.01400 0.07880

这种事情真的很常见。在大多数贝叶斯推理中,后验分布是一些(可能很大的)参数向量的函数,您想对这些参数的子集进行推理。

在一个等级模型中,你可能会有大量的随机效应项被拟合,但是你最想对一个参数做出推论。在

贝叶斯框架中,您可以计算您感兴趣的参数在所有其他参数上的边际分布(这是我们上面要做的)。


【视频】马尔可夫链蒙特卡罗方法MCMC原理与R语言实现|数据分享(下):https://developer.aliyun.com/article/1491718

相关文章
|
2月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
3月前
|
存储 数据采集 数据处理
R语言数据变换:使用tidyr包进行高效数据整形的探索
【8月更文挑战第29天】`tidyr`包为R语言的数据整形提供了强大的工具。通过`pivot_longer()`、`pivot_wider()`、`separate()`和`unite()`等函数,我们可以轻松地将数据从一种格式转换为另一种格式,以满足不同的分析需求。掌握这些函数的使用,将大大提高我们处理和分析数据的效率。
|
2月前
R语言基于表格文件的数据绘制具有多个系列的柱状图与直方图
【9月更文挑战第9天】在R语言中,利用`ggplot2`包可绘制多系列柱状图与直方图。首先读取数据文件`data.csv`,加载`ggplot2`包后,使用`ggplot`函数指定轴与填充颜色,并通过`geom_bar`或`geom_histogram`绘图。参数如`stat`, `position`, `alpha`等可根据需要调整,实现不同系列的图表展示。
|
2月前
|
数据采集 数据可视化 数据挖掘
R语言在金融数据分析中的深度应用:探索数据背后的市场智慧
【9月更文挑战第1天】R语言在金融数据分析中展现出了强大的功能和广泛的应用前景。通过丰富的数据处理函数、强大的统计分析功能和优秀的可视化效果,R语言能够帮助金融机构深入挖掘数据价值,洞察市场动态。未来,随着金融数据的不断积累和技术的不断进步,R语言在金融数据分析中的应用将更加广泛和深入。
|
3月前
|
数据采集 机器学习/深度学习 数据挖掘
R语言数据清洗:高效处理缺失值与重复数据的策略
【8月更文挑战第29天】处理缺失值和重复数据是数据清洗中的基础而重要的步骤。在R语言中,我们拥有多种工具和方法来有效地应对这些问题。通过识别、删除或插补缺失值,以及删除重复数据,我们可以提高数据集的质量和可靠性,为后续的数据分析和建模工作打下坚实的基础。 需要注意的是,处理缺失值和重复数据时,我们应根据实际情况和数据特性选择合适的方法,并在处理过程中保持谨慎,以避免引入新的偏差或错误。
|
3月前
|
数据采集 存储 数据可视化
R语言时间序列分析:处理与建模时间序列数据的深度探索
【8月更文挑战第31天】R语言作为一款功能强大的数据分析工具,为处理时间序列数据提供了丰富的函数和包。从数据读取、预处理、建模到可视化,R语言都提供了灵活且强大的解决方案。然而,时间序列数据的处理和分析是一个复杂的过程,需要结合具体的应用场景和需求来选择合适的方法和模型。希望本文能为读者在R语言中进行时间序列分析提供一些有益的参考和启示。
|
3月前
|
数据处理
R语言数据合并:掌握`merge`与`dplyr`中`join`的巧妙技巧
【8月更文挑战第29天】如果你已经在使用`dplyr`进行数据处理,那么推荐使用`dplyr::join`进行数据合并,因为它与`dplyr`的其他函数(如`filter()`、`select()`、`mutate()`等)无缝集成,能够提供更加流畅和一致的数据处理体验。如果你的代码中尚未使用`dplyr`,但想要尝试,那么`dplyr::join`将是一个很好的起点。
|
6月前
|
数据采集 数据可视化
利用R语言进行因子分析实战(数据+代码+可视化+详细分析)
利用R语言进行因子分析实战(数据+代码+可视化+详细分析)
|
6月前
|
数据可视化 算法
【R语言实战】——kNN和朴素贝叶斯方法实战
【R语言实战】——kNN和朴素贝叶斯方法实战
|
6月前
|
Web App开发 数据可视化 数据挖掘
利用R语言进行聚类分析实战(数据+代码+可视化+详细分析)
利用R语言进行聚类分析实战(数据+代码+可视化+详细分析)
下一篇
无影云桌面