【发布时间】:2015-12-16 17:01:50
【问题描述】:
我有一个复杂的(非标准)分布函数,我想对其进行采样以使用逆 cdf 技术生成模拟数据点。 为了这个例子,我将考虑一个高斯分布
var=100
def f(x,a):
def g(y):
return (1/np.sqrt(2*np.pi*var))*np.exp(-y**2/(2*var))
b,err=integrate.quad(g,-np.inf,x)
return b-a
我想在a=[0,1]、a=np.linspace(0,1,10000,endpoint=False) 之间生成值,并使用scipy.optimize.fsolve 为每个a 求解x。
我有两个问题:
如何将
fsolve用于值数组a?fsolve进行初始猜测x0,如何选择一个好的猜测值?
谢谢
【问题讨论】:
-
这里
a的目的是什么,您是否要为a中的每个值反转cdf?我认为fsolve不会以这种方式处理数组,您可能需要调用它 10000 次。 -
关于 2 我不太确定,但您可以根据之前的
a绑定解决方案,因为 cdf 是非递减的。 -
@simonzack a 是 icdf 的值,我在定义中减去它让 fsolve 求解方程。不使用 fsolve 有没有其他数值求解积分上限的方法?
-
我不认为这个问题是解决它的地方,但为了提高效率,我建议使用ODE integrator 来集成 PDF once,然后将将结果值转换为插值对象以创建逆 CDF。之后,评估逆 CDF 只是一个函数调用,它是矢量化的(它适用于数组...我认为),因此您可以像
icdf(np.random.uniform(size=10000))一样轻松获取样本。