Запрашиваемые значения ниже нижнего предела изображения - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь вычислить инверсию функции внутри сэмплера Gibbs-slice в Python:

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

Вы можете найти график функции присоединен . Проблема исходит из аргумента домена. Используемая функция должна быть строго монотонной, в противном случае (как в моем случае) необходимо указать домен, в котором она находится. Когда я не использую аргумент домена, я не получаю никаких сообщений об ошибках, тогда как когда я использую его, как показано выше, я получаю:

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/.

1 Ответ

0 голосов
/ 28 октября 2019

После запуска вышеуказанного скрипта с функцией, обратное значение которой имеет пики и которую можно легко вычислить, я обнаружил, что это сообщение об ошибке означает, что значение, при котором я пытался вычислить обратное значение, меньше минимального значения обратного значения. ,Другими словами, я запрашиваю значение вне диапазона обратной функции.

...