1

次のプログラムを実行すると、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() 呼び出しの何が問題なのかわかりません。助けてください

4

3 に答える 3

2

leastsqはベクトルで動作するため、残差関数funcは少なくとも 2 の長さのベクトルを返す必要があります。したがって、に置き換えるreturn eqnreturn [eqn, 0.]、例が機能します。実行すると、次のようになります。

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

これは、絶対差の最小値に対する多くの正解の 1 つです。

スカラー関数を最小化したい場合fminは、optimize.fmin(func, Init).

ここでの問題は、これら 2 つの関数が同じように見えても、スカラーが異なる目的を目指していることです。 leastsq通常、一連の理想化された曲線から最小二乗誤差を見つけます。これは、「最適な適合」を行う 1 つの方法にすぎません。一方fmin、スカラー関数の最小値を見つけます。

明らかに、あなたの例はおもちゃの例であり、これらのどちらも実際には意味がありません.

于 2009-09-28T19:24:23.387 に答える
1

最小二乗法のドキュメントを見るだけで、関数funcが正しく定義されていない可能性があります。常に少なくとも長さ2の配列を受け取ると想定していますが、最適化関数は、受け取る配列の長さについてめちゃくちゃ曖昧です。apar実際に何が得られているかを確認するために、画面に何でも書いてみてください。

ipythonまたはpythonシェルのようなものを使用している場合は、エラーが発生している行を正確に示すスタックトレースを取得する必要があるため、そこから開始します。そこから理解できない場合は、スタックトレースを投稿するとおそらく役に立ちます。

于 2009-09-28T18:10:54.943 に答える
1

func()単純なスカラー関数 (値のリストではなく単一の値を返す)を最小化したいので、(適切な引数を使用して) 関数scipy.optimize.leastsq()の 1 つを呼び出すことで置き換える必要があります。fmin

x = optimize.fmin(func, Init)

正しく動作します!

実際、leastsq()値のリストの二乗和を最小化します。あなたの例のように、(理論的には可能ですが)単一の値では機能しないようです。

于 2009-09-28T20:26:18.567 に答える