从python中的多变量pdf中抽样

时间:2014-09-18 11:32:17

标签: python numpy scipy random-sample

我有一个多变量pdf P(x,y,z),我需要从中随机抽取样本。

使用单变量pdf我通常用样条逼近cdf,绘制0到1之间的随机数并评估样条:

from scipy import interpolate
import numpy

def P(x):
    return x**2

xs=numpy.linspace(0,1,101)
Px=P(xs)

cdf=numpy.cumsum(Px),numpy.sum(Px)
cdfspline=interpolate.splrep(cdf,xs)
randomx=interpolate.splev(numpy.random.random(1),cdf)

1 个答案:

答案 0 :(得分:1)

这不是一个Python问题,而是一个统计分析问题。

首先,定义您的间隔并规范您的PDF。间隔中PDF的三维积分应为1.在您的示例中,您通过将cdf除以sum(Px)来实现此目的(我假设该行中的逗号应该是斜线)。

查找拒绝抽样(例如,在维基百科中)。如果您只使用拒绝抽样,那么对PDF进行标准化并不是那么重要,但您最好确保函数形式不超过1。

您可以通过创建一定数量的试验x,y,z统一抽样来实现拒绝抽样,一次为您提供一个样本:Uxyz = rand(3,N)并返回第一个Uxyz[:,n] 0.001*PDF(Uxyz[0,n], Uxyz[1,n], Uxyz[2,n]) > rand(1) 。因子0.001是一些较小的数字(较小的因素会使您更少但分布更简洁的样本)。

使用像numpy这样的矢量工具,生成大量随机样本更有效,并返回通过拒绝采样的所有x,y,z。使用拒绝抽样的价格是您无法事先知道您从分销中获得的样本数量。

如何最有效地执行此操作的详细信息取决于多变量PDF的实际功能形式以及感兴趣的x,y,z间隔。例如,如果您可以将P(x,y,z)分隔为Px(x)*Py(y)*Pz(z)或甚至分成Pxy(x,y)*Pz(z),那么这将使您的工作更轻松。典型的例子是PDF看起来像exp(-a*x**2 - b*y**2 - c*z**2)