功能最大化

时间:2018-10-12 15:21:42

标签: python optimization scipy

我正在尝试使用以下代码最大化功能:

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)

1 个答案:

答案 0 :(得分:0)

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