Python:使用逆cdf技术进行采样

时间:2015-12-16 08:11:57

标签: python scipy

我有一个复杂的(非标准)分布函数,我想采样使用逆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。 我有两个问题:

  1. 如何将fsolve用于值数组a

  2. fsolve需要初步猜测x0,如何选择一个好的猜测值?

  3. 谢谢

1 个答案:

答案 0 :(得分:1)

这是你如何做到的,我用10替换10000,因为它需要一段时间。我的初始猜测只是0,我将其设置为上一次迭代以进行下一次猜测,因为它应该非常接近解决方案。如果你想要它,你可以进一步限制它,严格地高于它。

作为旁注,这种复杂分布的抽样并不可行,因为计算cdf可能相当困难。还有其他采样技术可以解决这些问题,如Gibbs采样,Metropolis Hastings等。

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 = sp.integrate.quad(g, -np.inf, x) 
    return b - a


a = np.linspace(0, 1, 10, endpoint=False)[1:]
x0 = 0
for a_ in a:
    xi = sp.optimize.fsolve(f, x0 + 0.01, args=(a_,))[0]
    print(xi)
    x0 = xi

[编辑]它似乎被卡在0附近,添加了一小部分修复它,我不知道为什么因为我不知道fsolve是如何工作的。