scipy is not optimizing and returns "Desired error not necessarily achieved due to precision loss"

math, optimization, python, scipy

Solution

I copied your example and tried a little bit. Looks like if you stick with BFGS solver, after a few iteration the `mu+ alpha * r` will have some negative numbers, and that's how you get the RuntimeWarning.

The easiest fix I can think of is to switch to Nelder Mead solver.

res = minimize(loglikelihood, (0.01, 0.1,0.1), method = 'Nelder-Mead',args = (atimes,))

And it will give you this result:

28.3136498357
  status: 0
    nfev: 159
 success: True
     fun: 27.982451280648817
       x: array([ 0.01410906,  0.68346023,  0.90837568])
 message: 'Optimization terminated successfully.'
     nit: 92

Problem

I have the following code which attempts to minimize a log likelihood function. ``` #!/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 ``` It gives me ``` 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]) ``` Notice that it hasn't managed to optimize the parameters at all and the minimized value 32 is bigger than 28 which is what you get with a= 0.01, alpha = 0.5, beta = 0.6 . It's possible this problem could be avoided by choosing better initial guesses but if so, how can I do this automatically? Nelder-Mead, TNC and SLSQP work as drop-in replacements. None of the other methods do.

Original source