我正在尝试使用以下代码最大化功能:
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)
答案 0 :(得分:0)
在调试器中进行一些快速调试后,发现norm.pdf(y, mu, sigma)
在一次迭代中返回了一个nan
数组。在同一迭代中,lognorm.pdf(sigma, loc=0, s=4)
返回零。甚至在此之前,sigma
被分配为负值。这确实是问题开始的地方。要确切跟踪为什么使用负params[1]
值调用函数会花费一些精力,但这确实发生了。我将使用调试器来逐步完成minimize
函数,以查看发生了什么。我相信负值会在第9次调用时传递给函数,如果有帮助的话。用于优化功能的方法可能不适用于您的特定功能。您可以尝试使用通过分配给method
参数来选择的另一种方法(有关更多详细信息,请参阅文档)。