scipy n'est pas de l'optimisation et de retours “Souhaité erreur n'est pas nécessairement dû à la perte de précision due”

J'ai le code suivant qui tente de minimiser un journal d'une fonction de vraisemblance.

#!/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

Il me donne

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])

Avis qu'il n'a pas réussi à optimiser les paramètres à tous et réduit la valeur 32 est plus grand que 28, qui est ce que vous obtenez avec un= 0,01, alpha = 0.5, bêta = 0.6 . Il est possible que ce problème pourrait être évité en choisissant mieux conjectures initiales, mais si oui, comment puis-je faire cela automatiquement?

  • Je pense que vous voulez maximiser LL, pas le minimiser. Si vous êtes à la réduction d'une somme de carrés, l'optimisation de LL.
  • Oui. Avis de la fonction renvoie -loglik qui gère cela.
  • Juste une remarque - une fois, j'ai eu un problème qui a partagé les mêmes symptômes que les vôtres, mais la cause était totalement différent. Il s'est avéré que j'avais un bug dans mon gradient de la fonction, donc quand je l'ai adoptée dans le la routine via le jac paramètre, la routine ne pouvait pas travailler. Les erreurs ont été cryptique et c'est seulement sur la ré-inspection de mon code que j'ai identifié le bug. Cela dit, la réponse ci-dessous qui utilise Nelder-Mead vraiment aidé parce qu'il pourrait optimiser sans le dégradé, et a donné la bonne réponse pour moi, de m'aider à me rendre compte que le problème était avec le bug dans mon gradient de la fonction.
InformationsquelleAutor felix | 2014-07-15