Domanda

mi trovo di fronte un problema in SciPy 'leastsq' di routine di ottimizzazione, se eseguo il seguente programma che dice

    raise errors[info][1], errors[info][0]
TypeError: Improper input parameters.

e, a volte index out of range for an array ...

from scipy import *
import numpy
from scipy import optimize
from numpy import asarray
from math import *

def func(apar):
  apar = numpy.asarray(apar)
  x = apar[0]
  y = apar[1]
  eqn = abs(x-y)
  return eqn

Init = numpy.asarray([20.0, 10.0])
x = optimize.leastsq(func, Init, full_output=0, col_deriv=0, factor=100, diag=None, warning=True)
print 'optimized parameters: ',x
print '******* The End ******'

Non so qual è il problema con la mia func optimize.leastsq () chiamata, ti prego, aiutami

È stato utile?

Soluzione

leastsq lavora con vettori così la funzione residuale, func, deve restituire un vettore di lunghezza almeno due. Quindi, se si sostituisce return eqn con return [eqn, 0.], il tuo esempio funzionerà. Esecuzione dà:

optimized parameters:  (array([10., 10.]), 2)

, che è una delle tante risposte corrette per il minimo della differenza assoluta.

Se si vuole ridurre al minimo una funzione scalare, fmin è la strada da percorrere, optimize.fmin(func, Init).

Il problema qui è che queste due funzioni, anche se lo stesso aspetto per scalari sono finalizzate a obiettivi diversi. leastsq trova l'errore minimo quadrato, in genere da una serie di curve idealizzate, ed è solo un modo di fare un "best fit". D'altra fmin mano trova il valore minimo di una funzione scalare.

Ovviamente il vostro è un esempio di giocattolo, per la quale nessuna di queste realtà ha un senso, in modo da che parte si va dipenderà da ciò che il vostro obiettivo finale è.

Altri suggerimenti

Dal momento che si vuole ridurre al minimo una semplice funzione scalare (func() restituisce un singolo valore, non un elenco di valori), scipy.optimize.leastsq() dovrebbe essere sostituito da una chiamata a una delle funzioni fmin (con gli argomenti appropriati):

x = optimize.fmin(func, Init)

funziona correttamente!

In realtà, leastsq() minimizza la somma dei quadrati di un elenco di valori. Non sembra di lavorare su un (elenco contenente a) singolo valore, come nel tuo esempio (anche se potrebbe, in teoria).

Basta guardare le minimi quadrati docs , potrebbe essere che la funzione func è definita in modo non corretto. Stai supponendo che si riceve sempre un allineamento di almeno 2 lunghezza, ma la funzione Optimize è follemente vaga circa la lunghezza della matrice che riceverete. Si potrebbe provare a scrivere per lo screening qualunque apar è, per vedere che cosa si sta effettivamente ricevendo.

Se stai usando qualcosa come ipython o la shell Python, si dovrebbe essere sempre tracce dello stack che mostrano esattamente quale linea si verifica l'errore, in modo cominciare da lì. Se non è possibile capirlo da lì, pubblicando la traccia dello stack probabilmente ci aiutano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top