scipy ist nicht die Optimierung und liefert "die Gewünschten Fehler nicht unbedingt erreicht durch Präzision Verlust"

Habe ich den folgenden code versucht zu minimieren, eine log-likelihood-Funktion.

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

Es gibt mir

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

Beachten Sie, dass es noch nicht geschafft die Optimierung der Parameter und der minimierten Wert 32 ist größer als 28, die ist, was Sie erhalten mit a= 0,01, alpha = 0.5, beta = 0.6 . Es ist möglich, dieses problem könnte vermieden werden, indem die Auswahl der besseren ersten Vermutungen aber wenn es so ist, wie kann ich dies automatisch?

Ich würde denken, Sie wollen würde, um zu maximieren, LL, nicht minimieren. Wenn Sie die Minimierung einer Summe von Quadraten, du bist Maximierung LL.
Ja. Beachten Sie die Funktion gibt -loglik welche diese verarbeitet.
Nur eine Bemerkung - ich hatte einmal ein problem, teilten die gleichen Symptome wie deiner, aber die Ursache war ganz anders. Es stellte sich heraus, dass ich hatte einen Fehler in meinem gradient-Funktion, so dass, wenn ich ging es in die routine über die jac parameter, die routine konnte nicht arbeiten. Die Fehler waren kryptisch und es war nur bei der re-Inspektion mein code, den ich identifiziert den Fehler. Das heißt, die Antwort unten, die verwendet Nelder-Mead wirklich geholfen, weil es könnte sich optimieren, ohne den Verlauf und gab die richtige Antwort für mich, hilft mir zu realisieren, dass das Problem mit dem bug in meinem gradient-Funktion.

InformationsquelleAutor felix | 2014-07-15

Schreibe einen Kommentar