1

に合います適合したパラメータを使用して新しいデータを予測します。のは、それをeq_m呼びましょう、私はモデル式を持つ

しかし、このeq_mは、それゆえ私は、次のスニペットを使用して、ラムダ、ミュー、シグマパラメータ値を取得するためにscipyのダウンロードのcurve_fitを使用した非直線的である:

opt_parms, parm_cov = o.curve_fit(eq_m, x, y,maxfev=50000) 
lamb , mu, sigm = opt_parms 

私はすべてのあるデータのさまざまなグループにこのモデルを実行しますこのモデルに従うと仮定し、55/60は私に素晴らしい結果をもたらしますが、残りの5つのグループは非常にフィットしており、高い正の値を持つパラメータを予測しています。 scipy/numpyやscikit-learnを使ってカーブフィットを正規化し、大きな値のパラメータ値をペナルティできる方法はありますか?

私の上司が共役予備軍剤の使用を提案しましたが、ここでそれを行う方法はわかりません。

誰もがこれで私を助けてくださいことはできますか?この問題を解決するための推測を提供しなければならない人は、これらの推測を​​計算する方法を教えてください。

答えて

2

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 

次関数のパラメータを処罰するために厳密な必要はありません。基本的には何でもできますが、大きなパラメータでコストが増加することを確認してください。結果は変わります:-)

これは非常にアドホックなアプローチであり、厳密な理論的根拠に欠けています。ベイズ推定技法を使用することを期待しているように、共役プリオラーを使用するスーパーバイザの提案は聞こえます。特定のプライオリティは正規化と同等と見なすことができますが、アプローチはまったく異なり、むしろ数学的に関与する可能性があります。コスト関数の代わりに、尤度関数を定義し、パラメータでプリオリを定義し、ベイズのルールを使用してそれらを結合して、事後確率を得て最終的に最大化する必要があります。

関連する問題