[Python] 条件付きでフィッティングをする
概要
フィッティングを行いたい場合、pythonならばscipy.optimize.leastsqなどでできます。
しかし、フィッティングを行う場合、フィッティングパラメータに条件を付けたい場合も多々あります。
例えば、下記のようにパラメータa、bは共に正の範囲で最適な値を求める、という感じです。
f(x, a, b)=a*x^2+b (a>0 and b>0)
今回はそんな手法についてご紹介します。
方法
実際にフィッティングする場合は、フィッティング関数と実データとの差分をscipy.optimize.leastsqの第一引数に渡します。
def func(param, x):
return param[0]*x**2+param[1]
def fit(param, x, y):
def residual(param, x, y):
return y-func(param, x)
return optimize.leastsq(residual, param, args=(x, y))
条件付きでフィッティングしたい場合は、パラメータが条件を満たさない場合は実データと関数の差分を大きくするような関数を最小化するようにすれば良いです。
def residual(param, x, y):
return y-func(param, x) + param_condition(param)
def param_condition(param):
if (paramが条件を満たす):
return 0
else:
return np.inf
※注意
目的関数が微分不可能になるのでフィッティングにかかる時間がかなり長くなります。
(ソースをしっかり見たわけではないのですが、普通は最適パラメータ探索のために目的関数の勾配を利用していると思います。)
最新記事
すべて表示概要 pythonでデータ解析を行っている。解析自体はpandasを用いて行い、最終結果はpandas.DataFrameの形式で保持されている。 この結果を他のアプリケーションで利用するため、json形式でファイル出力したい。 やり方 1...
現象 raspberry piでfirestoreをimportしようとするとタイトルのエラーが発生。 from from firebase_admin import firestore ImportError: Failed to import the Cloud...
現象 spicy.optimizeのleastsqで最小二乗法でフィッティングをしようとしたらタイトルのエラーが発生。 from scipy import optimize import numpy as np def internalFunc1(x, plist): ...
Comments