我试图在Python中计算Gibbs切片采样器中函数的逆:
from pynverse import inversefunc
import numpy as np
import random
def zdens(z):
return -(z+0.5)**5+3*(z+0.5)**2+z+0.5
myfunc = (lambda z: -(z+0.5)**5+3*(z+0.5)**2+z+0.5)
Nreal,Ngal,currentz=2000,400,0.8
zsamp=np.zeros((Nreal,Ngal))
for m in range(Nreal):
for k in range(Ngal):
proposedz=np.random.uniform(0,zdens(currentz))
zsamp[m][k]=np.random.uniform(inversefunc(myfunc,y_values=proposedz,domain=[0,0.613244]),inversefunc(myfunc, y_values=proposedz,domain=[0.613244,2]))
zsamp[m][k]=currentz
您可以找到函数attached的绘图。问题来自域参数。使用的函数应该是严格单调的,否则(在我的例子中),应该提供它所在的域。当我不使用domain参数时,我不会收到任何错误消息,而当我使用上面显示的参数时,我会收到:
ValueError Traceback (most recent call last) <ipython-input- 39-60eac97f0d9a> in <module>
17 for k in range(Ngal):
18 proposedz=np.random.uniform(0,zdens(currentz))
---> 19 zsamp[m][k]=np.random.uniform(inversefunc(myfunc,y_values=proposedz,domain=.[0,0.613244]),inversefunc(myfunc, y_values=proposedz,domain=[0.613244,2]))
20 zsamp[m][k]=currentz
/usr/local/lib/python3.7/site-packages/pynverse/inverse.py in inversefunc(func, y_values,domain, image, open_domain, args, accuracy)
201 return inv
202 else:
--> 203 return inv(y_values)
204
205
/usr/local/lib/python3.7/site-packages/pynverse/inverse.py in inv(yin)
149 raise ValueError("Requested values %s lower than the"
150 " lower limit %g of the image" %
--> 151 (yin[mask], ymin))
152 if ymax is not None:
153 if (xmax_open and trend == 1) or (xmin_open and trend == -1):
ValueError: Requested values [0.81974978] lower than the lower limit 1.21875 of the image
下面是函数的文档,我觉得在这方面没有帮助:https://pypi.org/project/pynverse/
在用一个函数运行上面的脚本时,我发现这个错误消息意味着我一直试图计算逆的值低于逆的最小值。换句话说,我请求的值超出反函数的范围
相关问题 更多 >
编程相关推荐