SciPy 'Ridurre al minimo la somma dei quadrati di un insieme di equazioni'
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
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.