理解Gibbs采样(含二维下的C语言实现)

互联网大数据处理技术与应用2018-12-06 07:43:32

本号以技术性、原创性为特色,推送的原创文章(部分): 

SVM分类器的三个层次

数据世界的表示方法:从逻辑结构到图谱结构

关于网络爬虫的历史与现状、问题与出路的一些思考

互联网大数据挖据挖出“独角兽”---介绍工具和方法

...



       给定一个概率分布,要获得满足该分布的样本点,这个过程就是采样。采样在深度学习、概率建模等许多场合有重要应用,是数据处理的基础。

       对于一维随机变量来说,要获得满足某个分布p(x)的样本点,通常的做法就是随机产生一个[0,1]区间的数字d,然后从值域区间,例如0开始以小步长累加对应的函数值,直到累加值超过p(d),此时就采样到一个样本。



       但是在高维空间中,这种累加方法基本就无效。Gibbs采样是解决高维空间采样的一种主要方法,在著名的LDA主题模型中就采用了Gibbs采样的参数估计方法,这也在一定程度上也推动了Gibbs采样被更多人所了解。

       以二维为例,比如x1={白天,晚上},x2={运动,学习,睡觉},现在已知两个条件概率分布,分别表示p(x2|x1)和p(x1|x2)。



        对于二维,沿着坐标轴x1和x2不断转移,在这个过程中根据p(x2|x1)和p(x1|x2)生成对应的随机变量值,从而可以得到一个诸如(白天,运动),(运动,晚上),(晚上,睡觉),(睡觉,晚上),(晚上,学习)...这样的序列,首尾相接。这个序列的产生过程就是Gibbs采样过程。

        但是,我们使用Gibbs采样并不只是为了产生一个这样的序列,而是为了估计联合分布p(x1,x2)或像在LDA模型中估计函数隐变量的模型参数,因此,就希望能够利用这条序列来进行参数估算。

        由于参数估算需要统计确切的(x1,x2)出现的次数,如果(x1,x2)的值过于随机,那么这样估计得到的参数就没有意义。

而在Gibbs采样中确实存在一个称为burn-in的阶段,在这个阶段中产生的样本随机性太大,因此跳过这个阶段后的样本才能拿来估算。


         以下是用C语言实现的上述两个维度下的gibbs采样过程,并分别记录下了burn-in(L)=5、10、20、800、1000的变量统计数字,最后由此计算出对应的累积概率分布,图中横轴就是gibbs采样的状态空间,共12个,包括{白天,晚上}和{运动,学习,睡觉}的任意组合3*2*2=12。




       可以看出,L=5、10的累积分布确实随机性太大,而L=800、1000时状态转移已经进入了稳态,两者基本重叠了,对稳态后的序列进行统计计算即可获得模型参数。




作者编著的《互联网大数据处理技术与应用》专著(清华大学出版社,2017)、同名公众号,专注于大数据技术的相关科学和工程知识传播,同时也为读者提供一些拓展阅读材料。关注后可阅读以前推送的原创文章。欢迎选用本书做大数据相关的教材,有相关教学资源共享。

点击--->《互联网大数据处理技术与应用》的相关教学资源

         互联网大数据技术的现状及发展趋势(PPT可下载)

         互联网大数据处理技术与应用的知识体系与教学思考(PPT,226页)



点击阅读原文链接,查看图书详情信息(目录、引言)。


Copyright © 温县电话机虚拟社区@2017