Передача ввода функции, возвращающей NaN в Python - PullRequest
0 голосов
/ 28 декабря 2018

Я использую EMCEE .Я пишу часть, проблема которой возникла в следующем.Я столкнулся с этой ошибкой ValueError: lnprob returned NaN.

эта ошибка прерывает расчет, и я не знаю, как преодолеть.Итак, я должен сделать что-то, чтобы передать эту ошибку, чтобы продолжить остальные вычисления.

Единственное, что мне пришло в голову, это добавить строку в lnprob функцию, такую ​​как:

 if not np.isfinite(lp):
        return -np.inf
 if  np.isnan(lp):
        return -np.inf

но это не правильно

код:

def log_prior(H0, od0, c, b, Orc, M):
    if  0.4 < od0 < 0.9 and  50 < H0 < 90  and  0 < c < 3 and  0 < b < 1  and  -0.3 < M < 0.2 and  0 < Orc < 0.1:
        return 0.0
    return -np.inf

def lnlike(H0, od0, c, b, Orc, M):
    lg = -chi2(H0, od0, c, b, Orc, M)/2.
    return lg

def lnprob(H0, od0, c, b, Orc, M):
    lp = log_prior(H0, od0, c, b, Orc, M)
    if not np.isfinite(lp):
        return -np.inf
    return lp + lnlike(H0, od0, c, b, Orc, M)

def func(theta):
    H0, od0, c, b, Orc, M = theta
    return -2. * lnprob(H0, od0, c, b, Orc, M)

Я ценю вашу помощь.

1 Ответ

0 голосов
/ 29 декабря 2018

Я просто хочу сказать, что Python, если lnprob равен NaN, не говоря уже о других значениях и продолжайте

Если это ^ все еще для вас, вы должны быть в состоянии сделать:

def func(theta):
    H0, od0, c, b, Orc, M = theta
    try:
       lnprobval = -2. * lnprob(H0, od0, c, b, Orc, M)
    except ValueError: # NaN value case
       lnprobval = -np.inf # just set to negative infinity 
    return lnprobval

Этот код должен заменить оператор return в вашем def func(theta)

...