2017-11-13 17 views
0

私はこの質問がStackOverflowや他の場所でより適しているかどうかはわかりませんが、プログラミングだけであるのか、理解する必要があります。話題以外の場合、私は謝罪します。単一のパラメータを最適化してモデルと観測の違いを最小限にする

Pythonでは、私はかなり単純なモデルを作成しています。配列x、いくつかの係数c1c2など、最適化したいパラメータPをとる関数です。 パラメータPを変更して測定値とモデル値の差を最小限に抑え、結果として得られるパラメータ(スカラー)とその結果のモデルと測定値(配列)の差を出力したいと思います。

私はしばらくの間、scipy.optimize.minimizedocumentationを勉強していましたが、私はそれを取得していないようです。特に、私は理解しません:

  1. Pのみが変更されるように最小化を入力するスカラー関数を定義する方法。
  2. この場合、どの最小化方法が最適なのですか(私は最小二乗を仮定しましたが、ドキュメントを見ると他の方法がたくさんあるので、他の方法が推奨されていれば、そのオプションただし、勧告には説明が付属していなければならない。 (最適化の結果は全体としてPythonオブジェクトであるようだと、私は上記の非常に特定の出力をしたい)
  3. はどうやって所望の出力を得るのですか

例:

import numpy as np 

array1 = np.random.rand(10) 
array2 = np.arange(5.,55,5) 

from scipy.optimize import minimize 

def model(c1, c2, c3, x, P): 
    modelY = x*c1 + c2*x*P + c3 # some random function for which I need to optimize P 
    return modelY 

今私が欲しい最小限の関数がnp.abs(measured - modelY)で、変更したい唯一のパラメータがmodel関数の引数であるPであり、測定データを最初の推測として使用する場合は、どの構文をscipy.optimize.minimizeと一緒に使うのですか?それとも、私はそれらを単一の機能に入れるべきですか?しかし、それ以外の関数の他の引数をすべて変更しないように指定するにはどうすればよいですか? そして、どのようにして差異を抽出し、結果として最小化結果からPを得ますか?

+0

私はプログラミングについての決定的な問題であると考えています(* 2を除く - 使用する方法は手元の問題に依存しており、おそらくプログラマが答えるものではありません)。しかし、私が必要とする情報は、このサイトとドキュメンテーションに散在していると確信しています。私は現時点で詳細な時間が不足していますが、まずは '' curve_fit'(https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy)を見てください。 optimize.curve_fit.html)を使用することができます。 – kazemakase

+0

チップをありがとう!しかし、私はまだ 'curve_fit'で一つのスカラーを修正する方法と、結果として得られたスカラーを出力として返す方法を見ていません。 – durbachit

+0

これはおそらくすべてドキュメントに記載されています(あなたの質問のいくつかは簡単です)。さらに完全なコードがなければ、それほど多くは定義されていないので、コードを表示することも難しいです。また、モデルの内部も最適化自体にとって重要です! – sascha

答えて

2

あなたの質問imhoは説明とパラメータ名から多くの苦しみを抱いていましたが、私は今あなたが達成したいものを得ていると思います。

私はそれを少し簡略化して二つのアプローチ、良いもの悪いものでいくつかのコードを提示します。良い方法:1つの変数を最適化するには、1つの変数(minimize_scalar)にオプティマイザを使用します。悪いこと:多変量オプティマイザ(minimize)を使用しています。

おそらく、scipyのオプティマイザの使い方について、長い年月を話す人もいますが、私はそれをしません。私はちょうど言うでしょう:ドキュメントに従ってください! (ここでは最小限-ドキュメントから一部抜粋)最も重要なこと:

呼び出し可能にkwargsからは、渡された任意の他のパラメータに対応する方法(楽しい、X0、引数、** kwargsから、**オプション)と呼ばれています(例えば、コールバック、ヘッセなど)を最小限に抑えることができますが、その内容はメソッドのパラメータとしてペアごとに渡されます。また、jacがbool型として渡された場合、jacとfunがマングリングされるので、funは関数値だけを返し、jacはヤコビ行列を返す関数に変換されます。このメソッドはOptimizeResultオブジェクトを返さなければならない。

これが意味: Pは、あなたが(どちらの場合も)scipyのダウンロードのオプティマイザに与えるあなたの機能であなたの最初のパラメータです。それ以外のものは、Pythonのスコープルール(関数で使用可能な変数)またはargsを使用します。

コード:

import numpy as np 
from scipy.optimize import minimize, minimize_scalar 
np.random.seed(1)           # make this demo deterministic 

# Let's define some random-data and use names people can understand! 
f_x = np.random.rand(10) 
f_y = np.arange(5.,55,5) 
c1, c2, c3 = 2, 1.5, 0.321 

# Simple loss-function 
def loss(P, c1, c2, c3, f_x, f_y): 
    modelY = f_x*c1 + f_x*c2*P + c3         # prediction (vector) 
    return np.linalg.norm(f_y - modelY, 1)        # l1-loss (scalar) 

# GOOD APPROACH: minimize_scalar 
result = minimize_scalar(loss, args=(c1, c2, c3, f_x, f_y)) 
p_at_minimum = result.x # i'm a scalar! 
print('minimize_scalar result: ', p_at_minimum) 

# BAD APPROACH: minimize (multivariate) -> need guess/initial value! 
result = minimize(loss, np.zeros(1), args=(c1, c2, c3, f_x, f_y)) 
p_at_minimum = result.x # i'm a vector!!! 
print('minimize result: ', p_at_minimum) 

出力:

minimize_scalar result: 60.1334526945 
minimize result: [ 60.1334535] 

編集:ちょうど私のVAR-名も悪いことを、認識しました。 f_xはいくつかの機能のいくつかの評価ではなく、ちょうどxと呼ばれるべきですが、慎重に:xは最適化するパラメータです!

備考:と常に結果を確認してください!

など。

これは私がminim_scalarを推奨している理由です。この仮定は、より多くの仮定を使用し、したがってより堅牢です(調整が必要ない)!

+0

ああ、最初の推測は配列でなければなりません!したがって私の以前の試みのエラー! – durbachit

+0

これは本当にうまく見えますが、私が実際のデータのために働いているかどうかを探しています。もし何かが見逃してしまった場合に備えて... – durbachit

+1

これもリストにすることができます。しかし、適切な数の値で繰り返し実行できる必要があります(多変量オプティマイザを使用しています)。 Scipyは、最適化プロセスを設定する前に、このdimension-infoを使用しています(明示的なNを使用する最小の例はなく、常にx0から推論します)。 – sascha

関連する問題