3

入力として2つの独立変数x、yと3つのパラメーターを取得してa、b、cを見つける関数を当てはめようとしています。これは私のテストコードです:

import numpy as np
from scipy.optimize import curve_fit

def func(x,y, a, b, c):
    return a*np.exp(-b*(x+y)) + c    

y= x = np.linspace(0,4,50)
z = func(x,y, 2.5, 1.3, 0.5) #works ok
#generate data to be fitted
zn = z + 0.2*np.random.normal(size=len(x))
popt, pcov = curve_fit(func, x,y, zn) #<--------Problem here!!!!!

しかし、「func() は正確に 5 つの引数 (指定された 51) を受け取ります」というエラーが表示されます。引数 x,y を正しく渡すにはどうすればよいですか?

4

2 に答える 2

7

のドキュメントをscipy.optimize.curve_fit()見るだけで十分です。原型は

scipy.optimize.curve_fit(f, xdata, ydata, p0=None, sigma=None, **kw)

ドキュメントにはcurve_fit()、最初の引数としてターゲット関数、2 番目の引数として独立変数、3 番目の引数として従属変数、4 番目の引数としてパラメーターの開始値を指定して呼び出されると記載されています。まったく別の方法で関数を呼び出そうとしたので、機能しないことは驚くことではありません。具体的にはzn、パラメーターとして渡しましたp0。これが、関数が非常に多くのパラメーターで呼び出された理由です。

ドキュメントには、ターゲット関数の呼び出し方法も記載されています。

f: callable
モデル関数f(x, ...). 最初の引数として独立変数を取り、別の残りの引数として適合するパラメータを取る必要があります。

xdata: k 個の予測子を持つ関数の の長さのNシーケンスまたは の(k,N)形状の配列。
データが測定される独立変数。

従属変数の引数を分離するために使用しようとしましたが、引数の単一の配列である必要があります。修正されたコードは次のとおりです。

def func(x, a, b, c):
    return a * np.exp(-b * (x[0] + x[1])) + c    

N = 50
x = np.linspace(0,4,50)
x = numpy.array([x, x])          # Combine your `x` and `y` to a single
                                 # (2, N)-array
z = func(x, 2.5, 1.3, 0.5)
zn = z + 0.2 * np.random.normal(size=x.shape[1])
popt, pcov = curve_fit(func, x, zn)
于 2012-04-15T17:35:55.733 に答える
0

最初の2つの配列パラメーターをタプルとしてに渡し、パラメーターのタプルを受け入れるようにfunc変更してみてくださいfunc

通常、は曲線に適合する入力としてcurvefitxおよびyパラメータを受け入れることが期待されます。func(x)不思議なことに、xパラメーターは単一の値ではなく2つの値であるため(理由はわかりません)、関数を変更してx、を単一のパラメーターとして受け入れ、その中で展開する必要があります。

一般的に、3次元カーブフィッティングは、達成しようとしている方法とは異なる方法で処理する必要があります。3次元の散布図を線で近似しようとした次のSO投稿を確認できます。

>>> def func((x,y), a, b, c):
    return a*np.exp(-b*(x+y)) + c

>>> y= x = np.linspace(0,4,50)
>>> z = func((x,y), 2.5, 1.3, 0.5) #works ok
>>> zn = z + 0.2*np.random.normal(size=len(x))
>>> popt, pcov = curve_fit(func, (x,y), zn)
于 2012-04-15T17:08:38.047 に答える