curve_fit
は正規化をサポートしていません。常に最小二乗コスト関数を使用します。フィットを規則的にするには、最小コストの関数をscipy.optimize.minimize
で記述する必要があります。
てみましょう最初の最小化問題にカーブフィッティングを翻訳:
def eq_m(x, lamb, mu, sigm): # assumed signature of eq_m
pass
def cost(params): # simply use globally defined x and y
lamb, mu, sigm = params
model = eq_m(x, lamb, mu, sigm)
return np.mean((model - y)**2) # quadratic cost function
p0 = [1, 0, 1] # initial guess for lambda, mu, and sigma
res = o.minimize(cost, p0)
print(res) # see if minimization succeeded.
lamb, mu, sigm = res.x
これがうまくいけば、あなたにcurve_fit
と同様の結果が得られます。 (そうでない場合、それはデバッグを開始する時間です。)
今、私たちは正則を実装するためのコスト関数で遊ぶことができます。
def cost(params):
lamb, mu, sigm = params
model = eq_m(x, lamb, mu, sigm)
reg = lamb**2 + mu**2 + sigm**2 # very simple: higher parameters -> higher cost
regweight = 1.0 # determines relative importance of regularization vs goodness of fit
return np.mean((model - y)**2) + reg * regweight
次関数のパラメータを処罰するために厳密な必要はありません。基本的には何でもできますが、大きなパラメータでコストが増加することを確認してください。結果は変わります:-)
これは非常にアドホックなアプローチであり、厳密な理論的根拠に欠けています。ベイズ推定技法を使用することを期待しているように、共役プリオラーを使用するスーパーバイザの提案は聞こえます。特定のプライオリティは正規化と同等と見なすことができますが、アプローチはまったく異なり、むしろ数学的に関与する可能性があります。コスト関数の代わりに、尤度関数を定義し、パラメータでプリオリを定義し、ベイズのルールを使用してそれらを結合して、事後確率を得て最終的に最大化する必要があります。