蓄水池采样法(Reservoir Sampling)

蓄水池算法适用于对一个不清楚规模的数据集进行采样。尤其适合针对数据流进行采样,并不知道这个流什么时候结束,且须保证每单位数据被采样到的几率相同。

假设数据序列规模为数据采样 - 图1,需要采样的数量为数据采样 - 图2。内存中开辟可容纳数据采样 - 图3个元素的空间,并将序列前数据采样 - 图4个元素放入空间中。然后从第数据采样 - 图5个元素开始,以数据采样 - 图6的概率来决定该元素是否被替换到数组中(数组中的元素被替换的概率是相同的)。当遍历完所有元素后,内存中所存储的即为采样的样本。

证明:

对于第数据采样 - 图7个数(数据采样 - 图8),被选中的概率为数据采样 - 图9。当走到第数据采样 - 图10步时,被第数据采样 - 图11个元素替换的概率为数据采样 - 图12个元素被选中的概率乘以数据采样 - 图13被选择替换的概率,即数据采样 - 图14。则被保留的概率为数据采样 - 图15。依次类推,不被数据采样 - 图16个元素替换的概率为数据采样 - 图17。则运行到第数据采样 - 图18步时,被保留的概率为被选中的概率乘以不被替换的概率,即数据采样 - 图19

对于第数据采样 - 图20个数(数据采样 - 图21)。在第数据采样 - 图22步被选中的概率为数据采样 - 图23。不被第数据采样 - 图24个元素替换的概率为数据采样 - 图25。则运行到第数据采样 - 图26步时,被保留的概率为被选中概率乘以不被替换概率,即数据采样 - 图27

所以,对于每一个元素,被保留的概率都为数据采样 - 图28

逆采样(Inverse Sampling)

在蒙特卡罗方法中,有一个关键的问题需要解决,即如何基于概率密度函数去采得数据采样 - 图29数据采样 - 图30的样本。

逆采样(Inverse Sampling)和拒绝采样(Reject Sampling)就是用于解决这个问题的。

我们知道,对于常见的均匀分布数据采样 - 图31是非常容易采样的,一般通过线性同余发生器就可以很方便的生成数据采样 - 图32之间的伪随机数样本。而其他常见的概率分布,无论是离散的分布还是连续的分布,它们的样本都可以通过数据采样 - 图33的样本转换而得。那么应该如何得到呢?这就是逆采样。

我们以指数分布为例,说明如何通过均匀分布来采样服从指数分布的样本集。指数分布的概率密度函数PDF为:

数据采样 - 图34

那么它的概率分布函数为:

数据采样 - 图35

下图为指数分布和均匀分布的CDF图。从左图上看,在数据采样 - 图36的部分是一个单调递增的函数(在定义域上单调非减),定义于和值域是数据采样 - 图37,在数据采样 - 图38大的地方它增长快,反之亦然。

逆采样1.jpeg

因为它是唯一映射的(在大于数据采样 - 图40的部分,接下来我们只考虑这一部分),所以它的反函数可以表示为数据采样 - 图41数据采样 - 图42,值域为数据采样 - 图43。因为数据采样 - 图44单调递增,所以数据采样 - 图45也是单调递增的:

数据采样 - 图46
数据采样 - 图47

利用反函数的定义,我们有:

数据采样 - 图48

接下来,我们定义一下数据采样 - 图49均匀分布的CDF,这个很好理解:

数据采样 - 图50

根据上两式,有:

数据采样 - 图51

因为数据采样 - 图52的值域数据采样 - 图53,根据均匀分布的CDF,上式可改写为:

数据采样 - 图54

数据采样 - 图55的定义,它是数据采样 - 图56分布的CDF,所以上式的意思是数据采样 - 图57符合数据采样 - 图58分布,我们通过数据采样 - 图59的反函数将一个数据采样 - 图60数据采样 - 图61均匀分布的随机数转换成了符合数据采样 - 图62分布的随机数,注意,以上推导对于CDF可逆的分布都是一样的。对于数据采样 - 图63来说,它的反函数的形式是:

数据采样 - 图64

具体的映射关系可以看下图(a),我们从y轴0-1的均匀分布样本(绿色)映射得到了服从指数分布的样本(红色)

逆采样2.jpeg

最后绘制出来的直方图可以看出来就是数据采样 - 图66分布图,见上图(b)。可以看到随着采样数量的变多,概率直方图和真实的CDF就越接近。以上就是逆采样的过程。我们的结论是:因为CDF是单调函数(累积的概率只能越来越大,直到为1),因此,只要某分布的CDF可逆,那么就可以通过均匀分布来采样服从该分布的样本集。

拒绝采样(Reject Sampling)

对于常见的分布,如均匀分布,高斯分布,指数分布,t分布,F分布,Beta分布,Gamma分布等,可以采用逆采样的方法进行采样;不过很多时候,我们的概率分布不是常见的分布,这些分布的概率分布函数CDF 不可逆,因此没有办法用逆采样来采样,这意味着我们没法方便的得到这些非常见的概率分布的样本集。拒绝采样就是用来解决这个问题的一种随机采样方法。

我们以求圆周率数据采样 - 图67的例子入手,讲解拒绝采样的思想。通过采样的方法来计算数据采样 - 图68值,也就是在一个数据采样 - 图69的范围内随机采样一个点,如果它到原点的距离小于数据采样 - 图70,则说明它在数据采样 - 图71圆内,则接受它,最后通过接受的占比来计算数据采样 - 图72圆形的面积,从而根据公式反算出预估数据采样 - 图73的值,随着采样点的增多,最后的结果数据采样 - 图74会愈加准确。

拒绝采样.jpeg

上面这个例子里说明一个问题,我们想求一个空间里均匀分布的集合面积,可以尝试在更大范围内按照均匀分布随机采样,如果采样点在集合中,则接受,否则拒绝。最后的接受概率就是集合在”更大范围“的面积占比。接下来,我们来形式化地说明拒绝采样。

给定一个概率分布数据采样 - 图76,其中,数据采样 - 图77已知,数据采样 - 图78为归一化常数,未知。要对该分布数据采样 - 图79进行拒绝采样,首先需要借用一个简单的参考分布(proposal distribution),记为数据采样 - 图80,该分布的采样易于实现,如均匀分布、高斯分布。然后引入常数数据采样 - 图81,使得对所有的数据采样 - 图82,满足数据采样 - 图83,如下图所示,红色的曲线为数据采样 - 图84,蓝色的曲线为数据采样 - 图85

拒绝采样2.png

在每次采样中,首先从数据采样 - 图87采样一个数值数据采样 - 图88,然后在区间数据采样 - 图89进行均匀采样,得到数据采样 - 图90。如果数据采样 - 图91,则保留该采样值,否则舍弃该采样值。最后得到的数据就是对数据采样 - 图92分布的一个近似采样。结合图,直观来理解上述的过程:在数据采样 - 图93这条线上,从数据采样 - 图94均匀采样中一个值,如果这个值小于数据采样 - 图95,即这个均匀采样的这个值落在了数据采样 - 图96下方,我们就接受数据采样 - 图97这个采样值。

我们知道,每次采样的接受概率计算如下:

数据采样 - 图98

所以,为了提高接受概率,防止舍弃过多的采样值而导致采样效率低下,数据采样 - 图99的选取应该在满足数据采样 - 图100的基础上尽可能小。

拒绝采样问题可以这样理解,数据采样 - 图101数据采样 - 图102轴之间的区域为要估计的问题,类似于求数据采样 - 图103提到的圆形区域,数据采样 - 图104数据采样 - 图105轴之间的区域为参考区域,类似于上面提到的正方形。由于数据采样 - 图106数据采样 - 图107轴之间的区域面积为数据采样 - 图108(原来的概率密度函数的面积为数据采样 - 图109,现在扩大了数据采样 - 图110倍)所以,数据采样 - 图111数据采样 - 图112轴之间的区域面积除以数据采样 - 图113即为对数据采样 - 图114的估计。在每一个采样点,以数据采样 - 图115为界限,落在数据采样 - 图116曲线以下的点就是服从数据采样 - 图117分布的点。

我们必须知道复杂分布的概率密度函数PDF,才可以进行拒绝采样。然而,在现实情况中:

  • 对于一些二维分布数据采样 - 图118,有时候我们只能得到条件分布数据采样 - 图119数据采样 - 图120,却很难得到二维分布的概率密度函数数据采样 - 图121的一般形式,这时我们无法用拒绝采样得到其样本集。
  • 对于一些高维的复杂非常见分布数据采样 - 图122,我们要找到一个合适的数据采样 - 图123数据采样 - 图124非常困难。

因此,实际上,我们仍然要找到一种方法可以解决如何方便得到各种复杂概率分布的对应的采样样本集的问题。马尔科夫链有能力帮助找到这些复杂概率分布的对应的采样样本集,而这也是MCMC采样的基础。

采样和蒙特卡罗方法

有许多原因使我们希望从某个分布中采样。当我们需要以较小的代价近似许多项或某个积分时,采样是一种很灵活的选择。有时候,我们使用它加速一些很费时却易于处理的求和估计,就像我们使用小批量对整个训练代价进行子采样一样。在其他情况下,我们需要近似一个难以处理的求和或积分,例如估计一个无向模型中配分函数对数的梯度时。在许多其他情况下,抽样实际上是我们的目标,例如我们想训练一个可以从训练分布采样的模型。

蒙特卡罗 vs 拉斯维加斯

我们知道,随机算法在采样不全时,通常不能保证找到最优解,只能说是尽量找。那么根据怎么个“尽量”法儿,我们我们把随机算法分成两类:

  • 蒙特卡罗算法:采样越多,越近似最优解;
  • 拉斯维加斯算法:采样越多,越有机会找到最优解;

举个例子,假如筐里有100个苹果,让我每次闭眼拿1个,挑出最大的。于是我随机拿1个,再随机拿1个跟它比,留下大的,再随机拿1个……我每拿一次,留下的苹果都至少不比上次的小。拿的次数越多,挑出的苹果就越大,但我除非拿100次,否则无法肯定挑出了最大的。这个挑苹果的算法,就属于蒙特卡罗算法——尽量找好的,但不保证是最好的

而拉斯维加斯算法,则是另一种情况。假如有一把锁,给我100把钥匙,只有1把是对的。于是我每次随机拿1把钥匙去试,打不开就再换1把。我试的次数越多,打开(最优解)的机会就越大,但在打开之前,那些错的钥匙都是没有用的。这个试钥匙的算法,就是拉斯维加斯的——尽量找最好的,但不保证能找到

这两类随机算法之间的选择,往往受到问题的局限。如果问题要求在有限采样内,必须给出一个解,但不要求是最优解,那就要用蒙特卡罗算法。反之,如果问题要求必须给出最优解,但对采样没有限制,那就要用拉斯维加斯算法。

比如机器下棋的算法本质都是搜索树,围棋难在它的树宽可以达到好几百。在有限时间内要遍历这么宽的树,就只能牺牲深度(俗称“往后看几步”),但围棋又是依赖远见的游戏,甚至不仅是看“几步”的问题。所以,要想保证搜索深度,就只能放弃遍历,改为随机采样——这就是为什么在没有MCTS(蒙特卡罗搜树)类的方法之前,机器围棋的水平几乎是笑话。而采用了MCTS方法后,搜索深度就大大增加了。

蒙特卡罗采样的基础

蒙特卡罗原来是一个赌场的名称,用它作为名字大概是因为蒙特卡罗方法是一种随机模拟的方法,这很像赌博场里面的扔骰子的过程。最早的蒙特卡罗方法都是为了求解一些不太好求解的求和或者积分问题。比如积分:

数据采样 - 图125

如果我们很难求解出数据采样 - 图126的原函数,那么这个积分比较难求解。当然我们可以通过蒙特卡罗方法来模拟求解近似值。如何模拟呢?假设我们函数图像如下图:

蒙特卡罗1.png

一个简单的近似求解方法是在数据采样 - 图128之间随机的采样一个点。比如数据采样 - 图129,然后用数据采样 - 图130代表在数据采样 - 图131区间上所有的数据采样 - 图132的值。那么上面的定积分的近似求解为:

数据采样 - 图133

当然,用一个值代表数据采样 - 图134区间上所有的数据采样 - 图135的值太粗糙了。我们可以采样数据采样 - 图136区间的数据采样 - 图137个值:数据采样 - 图138,用它们的均值来代表数据采样 - 图139区间上所有的数据采样 - 图140的值。这样我们上面的定积分的近似求解为:

数据采样 - 图141

虽然上面的方法可以一定程度上求解出近似的解,但是它隐含了一个假定,即数据采样 - 图142数据采样 - 图143之间是均匀分布的,而绝大部分情况,数据采样 - 图144数据采样 - 图145之间不是均匀分布的。若我们用上面的方法,则模拟求出的结果很可能和真实值相差甚远

如果我们可以得到数据采样 - 图146数据采样 - 图147的概率分布函数数据采样 - 图148,那么我们的定积分求和可以这样进行:

数据采样 - 图149

上式最右边的这个形式就是蒙特卡罗方法的一般形式。当然这里是连续函数形式的蒙特卡罗方法,但是在离散时一样成立。关于上式,我们可以这么理解最后一步转换:由于数据采样 - 图150可以看做是数据采样 - 图151基于概率分布数据采样 - 图152的期望,那么我们可以用期望的方法来求这个式子的值。而计算期望的一个近似方法是取数据采样 - 图153的若干个基于分布数据采样 - 图154的采样点,然后求平均值得到。

Example

假设数据采样 - 图155的取值只有2个,数据采样 - 图156。对应的数据采样 - 图157值分别是数据采样 - 图158。其中数据采样 - 图159的取值不是平均的,取数据采样 - 图160的概率数据采样 - 图161,取数据采样 - 图162的概率数据采样 - 图163

那么严格来说,根据数据采样 - 图164,对应的数据采样 - 图165的积分等于数据采样 - 图166基于概率分布数据采样 - 图167的期望,根据公式,则有数据采样 - 图168

此时我们采样三次,期望求近似结果。假设第一次采样到1,第二三次采样到2,那么最后的近似结果是

数据采样 - 图169

这个数据采样 - 图170就是我们数据采样 - 图171的近似。虽然有些距离,但是由于采样太少原因。若我们采样100次,得到26次1,74次2,那么近似结果是数据采样 - 图172。可见结果越来越接近。接近的原因是随着采样数的增多,采样的样本分布越来越接近于数据采样 - 图173本来的分布。

基于马尔科夫链采样

马尔可夫链转移矩阵性质

马尔科夫链定义本身比较简单,它假设某一时刻状态转移的概率只依赖于它的前一个状态。举个形象的比喻,假如每天的天气是一个状态的话,那个今天是不是晴天只依赖于昨天的天气,而和前天的天气没有任何关系。当然这么说可能有些武断,但是这样做可以大大简化模型的复杂度,因此马尔科夫链在很多时间序列模型中得到广泛的应用,比如循环神经网络RNN,隐式马尔科夫模型HMM等,当然MCMC也需要它。

如果用精确的数学定义来描述,则假设我们的序列状态是数据采样 - 图174那么我们在时刻数据采样 - 图175的状态的条件概率仅仅依赖于时刻数据采样 - 图176,即:

数据采样 - 图177

既然某一时刻状态转移的概率只依赖于它的前一个状态,那么我们只要能求出系统中任意两个状态之间的转换概率,这个马尔科夫链的模型就定了。

马尔科夫1.png

这个马尔科夫链是表示股市模型的,共有三种状态:牛市(Bull market),熊市(Bear market)和横盘(Stagnant market)。每一个状态都以一定的概率转化到下一个状态。比如,牛市以0.025的概率转化到横盘的状态。这个状态概率转化图可以以矩阵的形式表示。如果我们定义矩阵数据采样 - 图179某一位置数据采样 - 图180的值为数据采样 - 图181,即从状态数据采样 - 图182转化到状态数据采样 - 图183的概率,并定义牛市为状态0,熊市为状态1,横盘为状态2。这样我们得到了马尔科夫链模型的状态转移矩阵为:

数据采样 - 图184

讲了这么多,那么马尔科夫链模型的状态转移矩阵和我们蒙特卡罗方法需要的概率分布样本集有什么关系呢?这需要从马尔科夫链模型的状态转移矩阵的收敛性质讲起。马尔科夫链模型的状态转移矩阵收敛到的稳定概率分布与我们的初始状态概率分布无关,且这个稳定分布是唯一的。这是一个非常好的性质,也就是说,如果我们得到了这个稳定概率分布对应的马尔科夫链模型的状态转移矩阵,则我们可以用任意的概率分布样本开始,带入马尔科夫链模型的状态转移矩阵,这样经过一些序列的转换,最终就可以得到符合对应稳定概率分布的样本。

基于马尔可夫链的采样

如果我们得到了某个平稳分布所对应的马尔科夫链状态转移矩阵数据采样 - 图185,我们就很容易采用出这个平稳分布的样本集。

假设我们任意初始的概率分布是数据采样 - 图186,经过第一轮马尔可夫链状态转移后的概率分布是数据采样 - 图187,第数据采样 - 图188轮的概率分布是数据采样 - 图189。假设经过数据采样 - 图190轮后马尔可夫链收敛到我们的平稳分布数据采样 - 图191,即:

数据采样 - 图192

对于每个分布数据采样 - 图193,我们有:

数据采样 - 图194

现在我们可以开始采样了,首先,基于初始任意简单概率分布比如高斯分布数据采样 - 图195采样得到状态值数据采样 - 图196,基于条件概率分布数据采样 - 图197采样状态值数据采样 - 图198,一直进行下去,当状态转移进行到一定的次数时,比如到数据采样 - 图199次时,我们认为此时的采样集数据采样 - 图200即是符合我们的平稳分布的对应样本集,可以用来做蒙特卡罗模拟求和了。

采样过程

  1. 输入马尔可夫链状态转移矩阵数据采样 - 图201,设定状态转移次数阈值数据采样 - 图202,需要的样本个数数据采样 - 图203
  2. 从任意简单概率分布采样得到初始状态值数据采样 - 图204
  3. 数据采样 - 图205:从条件概率分布数据采样 - 图206中采样得到样本数据采样 - 图207
  4. 样本集数据采样 - 图208即为我们需要的平稳分布对应的样本集

对采样过程的两点补充说明:

  • 第3.步,每对数据采样 - 图209采样一次就意味着模拟了一次数据采样 - 图210操作。在此过程中,状态转化矩阵数据采样 - 图211没有变化。
  • 第4.步,注意的是采样的样本集的下标是数据采样 - 图212,即状态稳定之后采样的样本才是我们需要的样本集。即我们需要从真正趋于稳定时候的分布抽样样本。

如果假定我们可以得到我们需要采样样本的平稳分布所对应的马尔科夫链状态转移矩阵数据采样 - 图213,那么我们就可以用马尔科夫链采样得到我们需要的样本集,进而进行蒙特卡罗模拟。但是一个重要的问题是,随意给定一个平稳分布数据采样 - 图214,如何得到它所对应的马尔科夫链状态转移矩阵数据采样 - 图215呢?这是个大问题。我们绕了一圈似乎还是没有解决任意概率分布采样样本集的问题。幸运的是,MCMC采样通过迂回的方式解决了上面这个大问题,以及它的使用改进版采样:M-H采样和Gibbs采样。

MCMC采样

在解决从平稳分布数据采样 - 图216,找到对应的马尔可夫链状态转移矩阵数据采样 - 图217之前,我们还需要先看看马尔科夫链的细致平稳条件,定义如下:

如果非周期马尔科夫链的状态转移矩阵数据采样 - 图218和概率分布数据采样 - 图219对于所有的数据采样 - 图220数据采样 - 图221满足:

数据采样 - 图222

则称概率分布数据采样 - 图223是状态转移矩阵数据采样 - 图224的平稳分布。

证明很简单,由细致平稳条件有:

数据采样 - 图225

将上式用矩阵表示即为:

数据采样 - 图226

即满足马尔可夫链的收敛性质。也就是说,只要我们找到了可以使概率分布数据采样 - 图227满足细致平稳分布的矩阵数据采样 - 图228即可。这给了我们寻找从平稳分布数据采样 - 图229,找到对应的马尔可夫链状态转移矩阵数据采样 - 图230的新思路。

不过不幸的是,仅仅从细致平稳条件还是很难找到合适的矩阵数据采样 - 图231。比如我们的目标平稳分布是数据采样 - 图232,随机找一个马尔可夫链状态转移矩阵数据采样 - 图233,它是很难满足细致平稳条件的,即:

数据采样 - 图234

MCMC采样是这样做的。由于一般情况下,目标平稳分布数据采样 - 图235和某一个马尔可夫链状态转移矩阵数据采样 - 图236不满足细致平稳条件,即上式。我们可以对上式做一个改造,使细致平稳条件成立。方法是引入一个数据采样 - 图237,使上式可以去等号,即:

数据采样 - 图238

问题是什么样的数据采样 - 图239可以使等式成立呢?其实很简单,只要满足下两式即可:

数据采样 - 图240
数据采样 - 图241

这样,我们就得到了我们的分布数据采样 - 图242对应的马尔可夫链状态转移矩阵数据采样 - 图243,满足:

数据采样 - 图244

也就是说,我们的目标矩阵数据采样 - 图245可以通过任意一个马尔可夫链状态转移矩阵数据采样 - 图246乘以数据采样 - 图247得到。数据采样 - 图248我们又一般称之为接受率,取值在数据采样 - 图249之间。物理意义可以理解为:在原来的马氏链上,从状态数据采样 - 图250数据采样 - 图251的概率转移到状态数据采样 - 图252的时候,我们以数据采样 - 图253的概率接受这个转移。即目标矩阵数据采样 - 图254可以通过任意一个马尔科夫链状态转移矩阵数据采样 - 图255以一定的接受率获得。这个很像拒绝采样的思想,那里是以一个常用分布通过一定的接受-拒绝概率得到一个非常见分布,这里是以一个常见的马尔科夫链状态转移矩阵数据采样 - 图256通过一定的接受-拒绝概率得到目标转移矩阵数据采样 - 图257,两者的解决问题思路是类似的。

采样过程

  1. 输入任意选定的马尔可夫链状态转移矩阵数据采样 - 图258,平稳分布数据采样 - 图259,设定状态转移次数阈值数据采样 - 图260,需要的样本个数数据采样 - 图261
  2. 从任意简单概率分布采样得到初始状态值数据采样 - 图262
  3. 数据采样 - 图263
    1. 从条件概率分布数据采样 - 图264中采样得到样本数据采样 - 图265
    2. 从均匀分布采样数据采样 - 图266
    3. 如果数据采样 - 图267,则接受转移数据采样 - 图268,即数据采样 - 图269
    4. 否则不接受转移,即数据采样 - 图270

样本集数据采样 - 图271即为我们需要的平稳分布对应的样本集。对于3.的d步,数据采样 - 图272意味着,尽管不接受转移,但是也把它放入了样本序列。而在有些算法中,被拒绝的样本就不进入采样样本序列。尽管双方有些mismatch,不过对理解算法影响不大。

上面这个过程基本上就是MCMC采样的完整采样理论了,但是这个采样算法还是比较难在实际中应用,为什么呢?问题在上面第三步的(c)步骤,接受率这儿。由于数据采样 - 图273可能非常的小,比如数据采样 - 图274,导致我们大部分的采样值都被拒绝转移,采样效率很低。有可能我们采样了上百万次马尔可夫链还没有收敛,也就是上面这个数据采样 - 图275要非常非常的大,这让人难以接受,怎么办呢?这时就轮到我们的M-H采样出场了。

M-H采样

M-H采样是Metropolis-Hastings采样的简称,这个算法首先由Metropolis提出,被Hastings改进,因此被称之为Metropolis-Hastings采样或M-H采样。M-H采样解决了MCMC采样接受率过低的问题。

我们回到MCMC采样的细致平稳条件:
数据采样 - 图276

我们采样效率低的原因是数据采样 - 图277太小了,比如为数据采样 - 图278,而数据采样 - 图279数据采样 - 图280。即:

数据采样 - 图281

我们可以看到,如果两边同时扩大五倍,接受率提高到了数据采样 - 图282,但是细致平稳条件却仍然是满足的,即:

数据采样 - 图283

这样我们的接受率可以做如下改进,即:

数据采样 - 图284

对上式多解释一下:此时数据采样 - 图285已经不是原来的意义,变为了数据采样 - 图286的倍率关系,这里默认右边为数据采样 - 图287,看左边的较大的那个接受率的值。即当原始的数据采样 - 图288时,数据采样 - 图289扩大了数据采样 - 图290倍;数据采样 - 图291时,数据采样 - 图292直接变为数据采样 - 图293

采样过程

  1. 输入任意选定的马尔可夫链状态转移矩阵数据采样 - 图294,平稳分布数据采样 - 图295,设定状态转移次数阈值数据采样 - 图296,需要的样本个数数据采样 - 图297
  2. 从任意简单概率分布采样得到初始状态值数据采样 - 图298
  3. 数据采样 - 图299
    1. 从条件概率分布数据采样 - 图300中采样得到样本数据采样 - 图301
    2. 从均匀分布采样数据采样 - 图302
    3. 如果数据采样 - 图303,则接受转移数据采样 - 图304,即数据采样 - 图305
    4. 否则不接受转移,即数据采样 - 图306

样本集数据采样 - 图307即为我们需要的平稳分布对应的样本集。

吉布斯采样(Gibbs sampling)

M-H采样已经可以很好的解决蒙特卡罗方法需要的任意概率分布的样本集的问题。但是M-H采样有两个缺点:一是需要计算接受率,在高维时计算量大。并且由于接受率的原因导致算法收敛时间变长。二是有些高维数据,特征的条件概率分布好求,但是特征的联合分布不好求。因此需要一个好方法改进M-H采样,这就是Gibbs采样。

从上面内容我们得到细致平稳条件:若非周期马尔科夫链的状态转移矩阵数据采样 - 图308和概率分布数据采样 - 图309对所有的数据采样 - 图310满足:

数据采样 - 图311

则称概率分布数据采样 - 图312是状态转移矩阵数据采样 - 图313的平稳分布。

在M-H采样中我们通过引入接受率使细致平稳条件满足。现在我们换一个思路。

从二维的数据分布开始,假设数据采样 - 图314是一个二维联合数据分布,观察第一个特征维度相同的两个点数据采样 - 图315数据采样 - 图316,容易发现下面两式成立:

数据采样 - 图317
数据采样 - 图318

成立的原因是:数据采样 - 图319数据采样 - 图320

由于上面两式右边相等,因此我们有:

数据采样 - 图321

也就是

数据采样 - 图322

观察上式再观察细致平稳条件的公式,我们发现在数据采样 - 图323这条直线上,如果用条件概率分布数据采样 - 图324作为马尔科夫链的状态转移概率,则任意两个点之间的转移满足细致平稳条件!这真是一个开心的发现,同样的道理,在数据采样 - 图325这条直线上,如果用条件概率分布数据采样 - 图326作为马尔科夫链的状态转移概率,则任意两个点之间的转移也满足细致平稳条件。那是因为假如有一点数据采样 - 图327,我们可以得到:

数据采样 - 图328

基于上面的发现,我们可以这样构造分布数据采样 - 图329的马尔可夫链对应的状态转移矩阵数据采样 - 图330

数据采样 - 图331
数据采样 - 图332
数据采样 - 图333

有了上面这样的状态转移矩阵数据采样 - 图334,我们很容易验证平面上的任意两点,数据采样 - 图335,满足细致平稳条件:

数据采样 - 图336

二维Gibbs采样

利用上一节找到的状态转移矩阵,我们就得到了二维Gibbs采样,这个采样必须要知道两个维度之间的条件概率。具体过程如下:

  1. 输入平稳分布数据采样 - 图337,设定状态转移次数阈值数据采样 - 图338,需要的样本个数数据采样 - 图339
  2. 随机初始化初始状态值数据采样 - 图340数据采样 - 图341
  3. 数据采样 - 图342
    1. 从条件概率分布数据采样 - 图343中采样得到样本数据采样 - 图344
    2. 从条件概率分布数据采样 - 图345中采样得到样本数据采样 - 图346

样本数据采样 - 图347即为我们需要的平稳分布对应的样本集。整个采样过程中,我们通过轮换坐标轴,采样的过程为:

数据采样 - 图348

用下图可以很直观的看出,采样是在两个坐标轴上不停的轮换的。当然,坐标轴轮换不是必须的,我们也可以每次随机选择一个坐标轴进行采样。不过常用的Gibbs采样的实现都是基于坐标轴轮换的。

吉布斯采样.png

多维Gibbs采样

上面的这个算法推广到多维的时候也是成立的。比如一个数据采样 - 图350维的概率分布数据采样 - 图351,我们可以通过数据采样 - 图352个坐标轴上轮换采样,来得到新的样本。对于轮换到的任意一个坐标轴数据采样 - 图353上的转移,马尔科夫链的状态转移概率为数据采样 - 图354,即固定数据采样 - 图355个坐标轴,在某一个坐标轴上移动。

采样过程

  1. 输入平稳分布数据采样 - 图356或者对应的所有特征的条件概率分布,设定状态转移次数阈值数据采样 - 图357,需要的样本个数数据采样 - 图358
  2. 随机初始化初始状态值数据采样 - 图359
  3. 数据采样 - 图360
    1. 从条件概率分布数据采样 - 图361中采样得到样本数据采样 - 图362
    2. 从条件概率分布数据采样 - 图363中采样得到样本数据采样 - 图364
    3. 从条件概率分布数据采样 - 图365中采样得到样本数据采样 - 图366
    4. 从条件概率分布数据采样 - 图367中采样得到样本数据采样 - 图368

样本数据采样 - 图369即为我们需要的平稳分布对应的样本集。整个采样过程和Lasso回归的坐标轴下降法算法非常类似,只不过Lasso回归是固定数据采样 - 图370个特征,对某一个特征求极值。而Gibbs采样是固定数据采样 - 图371个特征在某一个特征采样。

同样的,轮换坐标轴不是必须的,我们可以随机选择某一个坐标轴进行状态转移,只不过常用的Gibbs采样的实现都是基于坐标轴轮换的。

Source

https://www.zhihu.com/question/20254139/answer/33572009
https://www.jiqizhixin.com/articles/061001
https://blog.csdn.net/anshuai_aw1/article/details/84792383
https://blog.csdn.net/anshuai_aw1/article/details/84875521
https://blog.csdn.net/anshuai_aw1/article/details/84883617
https://www.cnblogs.com/snowInPluto/p/5996269.html