Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使用反向cdf技术进行采样_Python_Scipy - Fatal编程技术网

Python:使用反向cdf技术进行采样

Python:使用反向cdf技术进行采样,python,scipy,Python,Scipy,我有一个复杂的(非标准)分布函数,我想对其进行采样,以使用反向cdf技术生成模拟数据点

我有一个复杂的(非标准)分布函数,我想对其进行采样,以使用反向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,110000,endpoint=False)
之间的值,并使用
scipy.optimize.fsolve
为每个
a
求解x。 我有两个问题:

  • 如何将
    fsolve
    用于值数组
    a

  • fsolve
    进行初始猜测
    x0
    ,如何选择好的猜测值


  • 谢谢

    以下是您的操作方法,我将10000替换为10,因为这需要一段时间。我最初的猜测是0,我将它设置为下一次猜测的上一次迭代,因为它应该非常接近解决方案。如果你想的话,你可以进一步绑定它,所以它严格地在它上面

    作为一种旁白,这种针对复杂分布的抽样并不真正可行,因为计算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 = 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
    是如何工作的。

    这里
    a
    的目的是什么,您是否尝试为
    a
    中的每个值反转cdf?我认为
    fsolve
    不会以这种方式处理数组,您可能需要调用它10000次。关于2,我不太确定,但您可以基于前面的
    a
    绑定解决方案,因为cdf是非递减的。@simonzack a是icdf的值,我在定义中减去它,让fsolve解方程。有没有其他数值方法可以不用fsolve来求解积分的上限?我不认为这个问题是解决这个问题的地方,但为了效率,我建议使用一次积分PDF,然后将得到的值放入插值对象中以创建反向CDF。在那之后,计算反向CDF只是一个函数调用,一个矢量化的函数调用(它在数组上工作…我想),因此您可以像
    icdf(np.random.uniform(size=10000))
    一样轻松地获取样本。我想触及了它被卡住的原因。@DavidZ这是有意义的。谢谢,您的解决方案很有效,我选择初始猜测值为1而不是0。至于您对使用Metropolis Hasting和其他MCMC技术的评论,是的,我确实尝试过使用emcee对分布进行采样,但是当我使用模拟值最大化可能性时,我的最佳拟合值远远偏离了!也许我会打开一个新的帖子,强调我所做的事情,看看是否有办法提高准确性。