質問

私は以下のプログラムを実行している場合、それは言う、最適化ルーチン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 eqnreturn [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のシェルのようなものを使用している場合は、

は、エラーが発生している上のラインを正確にお見せスタックトレースを取得するべきであるので、そこを開始。あなたはそこからそれを把握できない場合は、スタックトレースを投稿することは、おそらく私たちを助けるます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top