我应该如何从混合分布中采样?

数据挖掘 Python 火炬 采样 scipy
2022-03-05 04:16:16

假设我们有一个混合分布,由密度定义f(x)=w1p1(x)+w2p2(x), 在哪里wi是一个标量权重。此外,我们有有效的方法来评估分布的 pdf 和 cdf/icdfDi对应于密度pi. 我想从这样的分布中取样。

我目前采用的方法是拒绝抽样的实现。我构建了一个提案函数Mu(x), 在哪里uUnif(lb,ub)(lb,ub构造成至少 99% 的 cdfDi包含在其中,使用 icdf) 和M是通过找到maxx[lb,ub],ipi(x). 因为这样的提案功能包络f, 我可以采样f通过选择xXUnif(lb,ub)×Unif(0,M)并拒绝如果π2x>f(x)[π2x是的第二个坐标x]。

但是,这样做很慢。不仅提案功能不合时宜(它是统一缩放的,这可能会导致许多拒绝),而且M非常慢,因为最大化函数是一项不平凡的任务。有没有更有效的方法来采样这种分布?我曾考虑过 icdf 采样,但构建 icdff似乎并不简单。这种印象不正确吗?或者也许还有其他有效的方法?如果有帮助,我将在 python 中实现它,目前正在使用 scipy 和 pytorch 库。

1个回答

可以通过以下方式获得混合分布。

f(x)=w1p1(x)+w2p2(x)+...+wnpn(x), 在哪里pi是密度函数和wi>0. 注意f(x)如果所有权重之和为 1,则为密度函数。

然后,我们使用以下两阶段过程。

阶段 1. 绘制随机变量X(选择器,如果我没记错的话),这样P(X=i)=wi为了i=1,2,...,n.

阶段 2. 返回相应绘制的随机变量pX, 在哪里X是第一阶段得到的指标。