40

Pythonには、多くのパラメーターを持つ関数があります。この関数をデータセットに適合させたいのですが、パラメーターを 1 つだけ使用し、残りのパラメーターは自分で提供したいと考えています。以下に例を示します。

def func(x,a,b):
   return a*x*x + b

for b in xrange(10):
   popt,pcov = curve_fit(func,x1,x2)

これでは、フィッティングが for のみで行われa、パラメーターbがループ変数の値を取ることを望みます。これはどのように行うことができますか?

4

7 に答える 7

55

func次のように、ラムダでラップできます。

def func(x,a,b):
   return a*x*x + b

for b in xrange(10):
   popt,pcov = curve_fit(lambda x, a: func(x, a, b), x1, x2)

ラムダは無名関数であり、Python では単純な 1 行の関数にのみ使用できます。基本的には、関数に名前を付ける必要がない場合にコード量を減らすために通常使用されます。より詳細な説明は、公式ドキュメントに記載されています: http://docs.python.org/tutorial/controlflow.html#lambda-forms

この場合、ラムダを使用して の引数の 1 つを修正しますfuncx新しく作成された関数はとの 2 つの引数のみを受け入れますがa、はローカル変数bから取得した値に固定されています。この新しい関数は、引数としてbに渡されます。curve_fit

于 2012-08-31T04:30:57.283 に答える
2

ダイジェストするのが直感的ではないラムダ関数を使用する代わりに、カスタム境界内でパラメーターを強制的に検索するscikit curve_fitパラメーターを指定することをお勧めします。bounds

必要なのは、変数aを -inf と +inf の間で移動させ、変数bを ( b - epsilon) と ( b + epsilon)の間で移動させることだけです。

あなたの例では:

epsilon = 0.00001

def func(x,a,b):
    return a*x*x + b

for b in xrange(10):
    popt,pcov = curve_fit(func,x1,x2, bounds=((-np.inf,b-epsilon), (np.inf,b+epsilon))
于 2018-05-21T15:18:13.687 に答える
1

もう 1 つの方法は、初期値として同一 (+ eps) の上限と下限を使用することです。初期条件と境界で同じ例を使用すると、次のようになります。

def func(x,a,b):
   return a*x*x + b
# free for a and b
popt,pcov = curve_fit(func, x1, x2, 
                      p0=[1,1], 
                      bounds=[(-inf,-inf),(inf,inf)])

# free for a; fixed for b  ; 
eps=1/100
popt,pcov = curve_fit(func, x1, x2, 
                      p0=[1,1], 
                      bounds=[(-inf,(1-eps)),(inf,(1+eps))])

イプシロンを挿入することを忘れないでください。それ以外の場合、a と b は同じでなければなりません

于 2020-11-25T07:30:58.273 に答える
0

元の関数を編集したい/編集できる場合は、より簡単なオプションがあります。

関数を次のように再定義します。

def func(x,a):
    return a*x*x + b

次に、パラメーター b のループに単純に入れることができます。

for b in xrange(10):
   popt,pcov = curve_fit(func, x1, x2)

警告: 関数は、これが機能するために呼び出されるのと同じスクリプトで定義する必要があります。

于 2017-03-05T22:09:21.280 に答える