4

任意の数の従属変数を持つ関数に基づいて lmfit モデルを構築する方法はありますか? 例えば:

from lmfit import Model

def my_poly(x, *params):
  func = 0
  for i in range(len(params)):
    func+= params[i]*z**i
  return func

#note: below does not work
my_model = Model(my_poly, independent_vars = ['x'], param_names = ['A','B','C'])

多項式級数に興味があり、級数が大きくなったり小さくなったりするときのパフォーマンスをテストしたい場合は、上記に似たものが素晴らしいでしょう。

4

1 に答える 1

4

Model()関数の引数名を使用してパラメーター名を作成するため、 usingは簡単には機能しません (それらを、、 、または他の名前ではなく、、、 と*params呼ぶことをどうやって知るのでしょうか?)。ABCcoeff0coeff1coeff2

本当に任意の数をサポートできるかどうかはわかりませんが、非常に大きな数をサポートできるはずです。多項式モデル ( http://lmfit.github.io/lmfit-py/builtin_models.html#polynomialmodelおよびhttps://github.com/lmfit/lmfit-py/blob/master/lmfit/models.py#L126を参照)実装用) 最大 7 つの係数をサポートします。それをはるかに大きな数に拡張しても問題ありません。簡単に計算上の問題につながる可能性がありますが、それはあなたが探求することを期待しているものだと思います.

少しの変更を加えることを厭わない場合は、探しているような何かを行うことが可能ですこれは、位置引数の代わりにキーワード引数を使用し、位置引数の順序ではなく、パラメーター名の順序 (つまりsort) に依存して、どの係数がどの指数に対応するかを示します。これはあなたが探しているものに近いかもしれません:

import numpy as np

from lmfit import Model, Parameters

def my_poly(x, **params):
    val= 0.0
    parnames = sorted(params.keys())
    for i, pname in enumerate(parnames):
        val += params[pname]*x**i
    return val

my_model = Model(my_poly)

# Parameter names and starting values
params = Parameters()
params.add('C00', value=-10)
params.add('C01', value=  5)
params.add('C02', value=  1)
params.add('C03', value=  0)
params.add('C04', value=  0)

x = np.linspace(-20, 20, 101)
y = -30.4 + 7.8*x - 0.5*x*x + 0.03 * x**3 + 0.009*x**4
y = y + np.random.normal(size=len(y), scale=0.2)

out = my_model.fit(y, params, x=x)
print(out.fit_report())

それが役立つことを願っています。

于 2015-09-06T20:23:20.473 に答える