【发布时间】:2019-03-17 20:47:27
【问题描述】:
我正在尝试使用以下代码最大化函数:
from scipy.optimize import minimize
from scipy.stats import lognorm, norm
import numpy as np
np.random.seed(123)
obs = np.random.normal(loc=20, scale=3, size=20)
# Log-Posterior optimisation objectiv
def objective(params, y):
mu = params[0]
sigma = params[1]
llikelihood = np.sum(np.log(norm.pdf(y, mu, sigma)))
lpost = llikelihood + np.log(norm.pdf(mu, 0, 100)) + np.log(lognorm.pdf(sigma, loc= 0, s = 4))
return -1*lpost
starting_mu = 0
starting_sigma = 1
optim_res = minimize(fun = objective, x0=(starting_mu, starting_sigma), args=(obs))
代码运行良好,直到最后的优化行。我非常有信心错误是我尝试在 R 中进行优化的方式,使用相同的设置和观察,objective() 评估为相同的值。此外,使用 optim() 函数确实优化到 mu=21.6 和 sigma=3.28 的值。
我可以使用 R 代码,但是,在 Python 中运行代码会更容易,这样它就可以与我正在做的所有其他事情集成。
编辑: 回溯消息是:
dert2@ma0phd201803:~$ python laplace_approx.py
laplace_approx.py:12: RuntimeWarning: divide by zero encountered in log
lpost = llikelihood + np.log(norm.pdf(mu, 0, 100)) + np.log(lognorm.pdf(sigma, loc= 0, s = 4))
laplace_approx.py:12: RuntimeWarning: divide by zero encountered in log
lpost = llikelihood + np.log(norm.pdf(mu, 0, 100)) + np.log(lognorm.pdf(sigma, loc= 0, s = 4))
laplace_approx.py:12: RuntimeWarning: divide by zero encountered in log
lpost = llikelihood + np.log(norm.pdf(mu, 0, 100)) + np.log(lognorm.pdf(sigma, loc= 0, s = 4))
/opt/anaconda3/lib/python3.7/site-packages/numpy/core/fromnumeric.py:83: RuntimeWarning: invalid value encountered in reduce
return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
【问题讨论】:
-
“代码运行良好,直到最后的优化行。” 然后会发生什么?请说明问题。你有错误吗?如果是这样,请在问题中包含 complete 错误消息(即完整的回溯)。
-
我看到的一个问题使这个问题与stackoverflow.com/questions/31388319/… 重复,但我不知道这是否是您正在处理的问题。
-
@WarrenWeckesser 略有不同。我现在已经添加了回溯。
-
调用
np.log(0)时会出现此错误。您需要保护您的对数免受零值的影响。
标签: python optimization scipy