我有一个复杂的(非标准)分布函数,我想采样使用逆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
,如何选择一个好的猜测值?
谢谢
答案 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
是如何工作的。