質問
私は以下のプログラムを実行している場合、それは言う、最適化ルーチンscipyのダウンロード「leastsq」内の問題に直面している。
raise errors[info][1], errors[info][0]
TypeError: Improper input parameters.
、時には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 ******'
私は自分のFUNC optimize.leastsq()の呼び出しに問題が何であるかを知らない、私を助けてください。
解決
leastsq
は、残存機能にベクターで動作func
、長さが少なくとも二つのベクトルを返す必要があります。あなたはreturn eqn
でreturn [eqn, 0.]
を置き換えるのであれば、あなたの例では動作します。それを実行すると与えます:
optimized parameters: (array([10., 10.]), 2)
の絶対差の最小値のための多くの正解の一つである。
あなたはスカラー関数を最小化したい場合は、、fmin
は移動するための方法、optimize.fmin(func, Init)
です。
ここでの問題は、彼らがスカラーのために同じように見えるが、これらの2つの関数は、異なる目標を目指しているということです。 leastsq
は、一般的に理想的な曲線の集合から、最小二乗誤差を見つけ、「ベストフィット」を行うためのひとつの方法です。他方fmin
にスカラー関数の最小値を検索します。
もちろん、あなたは、これらのどちらが本当に理にかなっているおもちゃの例は、ですので、どのあなたが最終的な目標が何であるかに依存します行く道ます。
他のヒント
func()
が単一の値ではなく、値のリストを返します)最小限にしたいので、、scipy.optimize.leastsq()
は、(適切な引数を持つ)fmin
関数のいずれかへの呼び出しに置き換える必要があります:
x = optimize.fmin(func, Init)
正常に動作します!
は、実際には、leastsq()
は、値のリストの二乗の和を最小化します。それは、(理論的には、でもそれはできるが)あなたの例のように、単一の値(含むリスト)上で動作するようには表示されません。
ただ、最小二乗のドキュメントを見て、それはあなたの関数func
が誤って定義されていることかもしれません。あなたは常に、少なくとも長さ2の配列を受け取ることを想定しているが、最適化機能は、あなたが受け取る配列の長さはおよそめちゃくちゃあいまいです。あなたが実際に取得しているかを確認するために、あるものは何でもapar
スクリーニングに書いてみてください。
ipython
やPythonのシェルのようなものを使用している場合は、は、エラーが発生している上のラインを正確にお見せスタックトレースを取得するべきであるので、そこを開始。あなたはそこからそれを把握できない場合は、スタックトレースを投稿することは、おそらく私たちを助けるます。