Gibbs

1.gibbs简析:

 gibbs采样需要知道样本中一个属性在其它所有属性下的条件概率,然后利用这个条件概率来分布产生各个属性的样本值。gibbs采样属于随机模拟抽样算法中的一种(一类近似求解的方法)。随机模拟的核心是对一个分布进行抽样,常用的抽样算法包括:1. 接受-拒绝抽样;2)重要性抽样;3)MCMC(马尔科夫链蒙特卡洛方法)方法,它包括两个非常著名的采样算法(metropolis-hasting算法和它的特例Gibbs采样算法)(补充:MCMC方法最早由Metropolis(1954)给出,后来Metropolis的算法由Hastings改进,合称为M-H算法。M-H算法是MCMC的基础方法。由M-H算法演化出了许多新的抽样方法,包括目前在MCMC中最常用的Gibbs抽样也可以看做M-H算法的一个特例)。

2.那么采样究竟是解决什么样的问题?

 采样就是通过将一个不太好解决的问题转化为一个可以通过采样来解决的问题,用什么方法来采样比较好,这是一个创新的问题,一般没有固定的解法。

3.常见的采样方法

3.1 直接采样(简单)

3.2 接受-拒绝抽样(Acceptance-Rejection sampling)下面内容来源

很多实际问题中,p(x)是很难直接采样的的,因此,我们需要求助其他的手段来采样。既然 p(x) 太复杂在程序中没法直接采样,那么我设定一个程序可抽样的分布 q(x) 比如高斯分布,然后按照一定的方法拒绝某些样本,达到接近 p(x) 分布的目的,其中q(x)叫做 proposal distribution(建议分布) 。

这里写图片描述

具体操作如下,设定一个方便抽样的函数 q(x),以及一个常量 k,使得 p(x) 总在 kq(x) 的下方。(参考上图)

  • 1.x 轴方向:从 q(x) 分布抽样得到 a。(如果是高斯,就用之前说过的 tricky and faster 的算法更快)
  • 2 . y 轴方向:从均匀分布(0, kq(a)) 中抽样得到 u。
  • 3.如果刚好落到灰色区域: u > p(a), 拒绝, 否则接受这次抽样
  • 重复以上过程

在高维的情况下,Rejection Sampling 会出现两个问题,第一是合适的 q 分布比较难以找到,第二是很难确定一个合理的 k 值。这两个问题会导致拒绝率很高,无用计算增加。

4.重要性抽样(Importance sampling)

重要性采样的理解是该方法目的并不是用来产生一个样本的,而是求一个函数的定积分的,只是因为该定积分的求法是通过对另一个叫容易采集分布的随机采用得到的。

下面图片来源:http://www.cnblogs.com/tornadomeet/archive/2013/03/26/2982694.html

这里写图片描述

其中通过对q(x)的随机采样,得到大量的样本x,然后求出f(x)*w(x)的均值,最终得出积分I值。其中的w(x)也就是重要性了,此时如果q(x)概率大,则得到的x样本数就多,这样w(x)的值也就多了,也间接体现了它越重要。

5.gibbs 采样

下面图片来源:http://www.cnblogs.com/tornadomeet/archive/2013/03/26/2982694.html

说明

5.1 Gibbs采样的目的是获得一个样本,不是计算概率,但可以通过其他方法来统计概率。

补充:

1 .MCMC理论简述:在满足【平衡方程】(detailed balance equation)条件下,MCMC可以通过很长的状态转移到达稳态。

平衡方程(F(x):指分布,p:指概率):

F(x)p(y|x)=F(y)p(x|y)F(x)∗p(y|x)=F(y)∗p(x|y)

该方程描述分布与条件概率之间的平衡关系。

2.什么是采样?

 sampling就是以一定的概率分布,看发生什么事.

3. DRF:Markov Random Field

reference:

### Gibbs Sampling算法机器学习中的应用 Gibbs Sampling是一种马尔可夫链蒙特卡罗(Markov Chain Monte Carlo, MCMC)方法,在贝叶斯统计中广泛应用于估计复杂的多维概率分布。当直接抽样困难时,该技术允许从条件分布间接抽取样本。 对于给定的数据集\(D\)以及参数\(\theta\),如果难以直接获取联合分布\(p(D,\theta)\),但可以较容易获得各变量的条件分布,则可以通过Gibbs Sampling逐步更新每个维度上的值来近似整个系统的状态空间[^2]。 具体到主题模型如潜在狄利克雷分配(Latent Dirichlet Allocation, LDA)[^1],其中文档-词项矩阵表示为\(W\)、主题比例向量表示为\(\alpha\)、每篇文档的主题分布表示为\(\beta\)。由于无法直接求得这些隐含结构的确切解,因此借助于Gibbs Sampling迭代地调整各个位置上单词对应的主题标签,从而逼近真实的后验分布: ```python import numpy as np def gibbs_sampling_lda(documents, K, alpha=0.1, beta=0.01, iterations=1000): """ 实现简单的LDA-Gibbs采样器 参数: documents (list of list): 文档集合,形式为[[word_id]]. K (int): 主题数量. alpha (float or array-like): 超参α,默认为0.1. beta (float or array-like): 超参β,默认为0.01. iterations (int): 迭代次数,默认为1000次. 返回: tuple: 包括z[n,d], nzw[z,w], ndz[d,z]. z(ndarray): 每个词语所属的主题编号; nzw(ndarray): 各主题下不同词汇的数量; ndz(ndarray): 不同文档内各类别的计数. """ D = len(documents) V = max([max(d) for d in documents]) + 1 # 单词总数目 N_d = [len(doc) for doc in documents] # 初始化辅助数组 z = [[np.random.randint(K) for _ in range(N)] for N in N_d] nzw = np.zeros((K,V)) ndz = np.zeros((D,K)) for i,doc in enumerate(z): for j,t in enumerate(doc): w = documents[i][j] nzw[t][w]+=1 ndz[i][t]+=1 for it in range(iterations): for di, document in enumerate(documents): for wi, word in enumerate(document): old_topic = z[di][wi] # 减去当前贡献 nzw[old_topic][word]-=1 ndz[di][old_topic]-=1 # 计算新topic的概率并重采样 p_z = ((nzw[:,word]+beta)/(ndz.sum(axis=-1)+V*beta)) * \ ((ndz[di,:]+alpha)/(sum(nzw[:,word])+K*alpha)) new_topic=np.argmax(np.random.multinomial(1,p_z/p_z.sum())) # 更新新的topic信息 z[di][wi]=new_topic nzw[new_topic][word]+=1 ndz[di][new_topic]+=1 return z,nzw,ndz ``` 此代码片段展示了如何基于Python实现一个基础版本的LDA-Gibbs Sampler。注意这只是一个简化版的例子,实际应用可能还需要考虑更多因素以提高效率和准确性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值