【发布时间】:2014-09-06 04:18:02
【问题描述】:
我有以下代码试图最小化对数似然函数。
#!/usr/bin/python
import math
import random
import numpy as np
from scipy.optimize import minimize
def loglikelihood(params, data):
(mu, alpha, beta) = params
tlist = np.array(data)
r = np.zeros(len(tlist))
for i in xrange(1,len(tlist)):
r[i] = math.exp(-beta*(tlist[i]-tlist[i-1]))*(1+r[i-1])
loglik = -tlist[-1]*mu
loglik = loglik+alpha/beta*sum(np.exp(-beta*(tlist[-1]-tlist))-1)
loglik = loglik+np.sum(np.log(mu+alpha*r))
return -loglik
atimes = [ 148.98894201, 149.70253172, 151.13717804, 160.35968355,
160.98322609, 161.21331798, 163.60755544, 163.68994973,
164.26131871, 228.79436067]
a= 0.01
alpha = 0.5
beta = 0.6
print loglikelihood((a, alpha, beta), atimes)
res = minimize(loglikelihood, (0.01, 0.1,0.1), method = 'BFGS',args = (atimes,))
print res
它给了我
28.3136498357
./test.py:17: RuntimeWarning: invalid value encountered in log
loglik = loglik+np.sum(np.log(mu+alpha*r))
status: 2
success: False
njev: 14
nfev: 72
hess_inv: array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
fun: 32.131359359964378
x: array([ 0.01, 0.1 , 0.1 ])
message: 'Desired error not necessarily achieved due to precision loss.'
jac: array([ -2.8051672 , 13.06962156, -48.97879982])
请注意,它根本没有设法优化参数,并且最小值 32 大于 28,这就是你得到的 a= 0.01, alpha = 0.5, beta = 0.6 。通过选择更好的初始猜测可以避免这个问题,但如果是这样,我怎样才能自动做到这一点?
【问题讨论】:
-
我认为你想要最大化 LL,而不是最小化它。如果您要最小化平方和,那么您就是在最大化 LL。
-
@MikeDunlavey 是的。请注意该函数返回处理此问题的
-loglik。 -
@felix 只是一个评论 - 我曾经遇到过与您的症状相同的问题,但原因完全不同。原来我的梯度函数有一个错误,所以当我通过
jac参数将它传递到例程中时,例程无法工作。这些错误很神秘,只有在重新检查我的代码后我才发现了这个错误。也就是说,下面使用Nelder-Mead的答案确实很有帮助,因为它可以在没有渐变的情况下进行优化,并为我提供了正确的答案,帮助我意识到问题出在我的渐变函数中。 -
有人能解释一下警告指的是什么precision loss吗?我觉得它很晦涩。
标签: python math optimization scipy