[解決済み] モデルパラメータをフィットさせるためのfmin_l_bfgs_bの正しい使用法
2022-02-17 19:35:28
質問事項
いくつかの実験データ(y, x, t_exp, m_exp)があります。 制約付き多変量BFGS法 . パラメータEは0より大きくなければならないが、他は無制限である。
def func(x, A, B, C, D, E, *args):
return A * (x ** E) * numpy.cos(t_exp) * (1 - numpy.exp((-2 * B * x) / numpy.cos(t_exp))) + numpy.exp((-2 * B * x) / numpy.cos(t_exp)) * C + (D * m_exp)
initial_values = numpy.array([-10, 2, -20, 0.3, 0.25])
mybounds = [(None,None), (None,None), (None,None), (None,None), (0, None)]
x,f,d = scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(m_exp, t_exp), bounds=mybounds)
少し質問です。
-
モデルの定式化
func
には、独立変数x
あるいは、実験データから提供されるべきかx_exp
の一部として*args
? -
上記のコードを実行すると、エラーが発生します。
func() takes at least 6 arguments (3 given)
というのは、x と私の 2 つの *args のことだと思います。どのように定義すればよいのでしょうか?func
?
EDIT: @zephyrさんの回答のおかげで、実際の関数ではなく、残差の二乗和を最小化することが目的であることを理解しました。以下のような動くコードにたどり着きました。
def func(params, *args):
l_exp = args[0]
s_exp = args[1]
m_exp = args[2]
t_exp = args[3]
A, B, C, D, E = params
s_model = A * (l_exp ** E) * numpy.cos(t_exp) * (1 - numpy.exp((-2 * B * l_exp) / numpy.cos(t_exp))) + numpy.exp((-2 * B * l_exp) / numpy.cos(theta_exp)) * C + (D * m_exp)
residual = s_exp - s_model
return numpy.sum(residual ** 2)
initial_values = numpy.array([-10, 2, -20, 0.3, 0.25])
mybounds = [(None,None), (None,None), (None,None), (None,None), (0,None)]
x, f, d = scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(l_exp, s_exp, m_exp, t_exp), bounds=mybounds, approx_grad=True)
境界線が正しく機能しているかどうかわかりません。Eに(0, None)を指定すると、実行フラグ2、異常終了になります。(1e-6, None)にすると、正常に実行されますが、Eとして1e-6が選択されます。境界の指定は正しいですか?
解決方法は?
使っているモデルが何を表現しているのか把握するのは面倒なので、線にフィッティングする簡単な例を紹介します。
x_true = arange(0,10,0.1) m_true = 2.5 b_true = 1.0 y_true = m_true*x_true + b_true def func(params, *args): x = args[0]. y = 引数[1]です。 m, b = パラメータ y_model = m*x+b エラー = y-y_model return sum(error**2) initial_values = numpy.array([1.0, 0.0]) mybounds = [(なし,2), (なし,なし)]です。 scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(x_true,y_true), approx_grad=True) scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(x_true, y_true), bounds=mybounds, approx_grad=True)
最初のオプティマイズは境界がなく、正しい答えを出します。2番目のオプティマイズは境界を尊重し、正しいパラメータに到達するのを防ぎます。
重要なことは、ほとんどすべての最適化関数において、'x' と 'x0' は最適化対象のパラメータを指し、それ以外はすべて引数として渡される、ということです。また、フィット関数が正しいデータ型を返すことも重要です。ここでは単一の値を返しますが、ルーチンによってはエラーベクトルを期待するものもあります。また、解析的に勾配を計算し、それを提供したいのでなければ、 approx_grad=True のフラグも必要です。
関連
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] ファイルに行を書き込む正しい方法?
-
[解決済み] スロットの使い方__?
-
[解決済み] パラメータを持つデコレータ?
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み】Pythonで指数・対数カーブフィットを行うには?私は多項式フィットしか見つかりませんでした
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
Pythonコンテナのための組み込み汎用関数操作
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
任意波形を生成してtxtで保存するためのPython実装
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み] データ型が理解できない
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?