0

minimize function from the scipy moduleを使用しようとしています。完全なコードは長すぎて投稿することはできませんが、主な考え方は、データセットに適合しなければならない複数の定義されたディストリビューションがあることです。ビンごとの観測値は、データセットから簡単に計算できますが、ビンあたりの期待値は、1つの引数を使用してビン境界(ビン境界がヒストグラムビンと同一)上に統合されるべきであることを指定する関数によって計算されます。 I = 1,2,3(各分布に1つ)の3つの関数chisqIがあり、それぞれがbinごとに指定された観測値を入力し、binごとの期待値を入力してchi squareを出力します。次に、3つの関数があり、それぞれがchisqIとargsを入力して、最小化された関数の結果と最適化されたパラメータを出力します。ここで、argsは最小のカイ2乗を生成するために最適化されるパラメータmuおよびsigmaである。私はあるディストリビューションの関数連鎖を通して引数を渡すことができました。そして、ある関数からどのディストリビューションがチェーンの下で処理されているのかを指定する別のargを渡す必要があるのだろうかと思います。私は推測として入力した "最適化された"パラメータの出力を最小化(SCIPY経由)しないでください。

Nelder-MeadやCGのように、最小化関数が使用できるさまざまな方法があります。私は、最良のフィットを提供するものを見つけるために、さまざまな方法の結果を比較しようとしてきました(実際のデータセットと比較して、最小のカイ二乗または最大のp値を生成するフィット)。面白いことに、Nelder-MeadとPowellの方法は、他の方法と比較して最も低いカイ2乗を生成しますが、実際のデータのヒストグラムに対してプロットされたフィットは、他の方法でよく見えます。以下のコード出力では、関数の値はカイ二乗値に関連付けられたp値の負数です。これが最小化された結果です。 CHISQ_REDは、CHISQ_TOTおよび自由度を使用することによって縮小されたカイ二乗値であり、一方、x: arrayの第1および第2の要素は、分布について最適化されたパラメータμおよびシグマである。

Nelder-Mead最小化メソッドを実行すると、以下の出力が生成されます。

final_simplex: (array([[ 6.00002802, 0.60020636], 
     [ 5.99995429, 0.60018798], 
     [ 6.0000716 , 0.60011127]]), array([ -5.16845821e-21, -5.16838926e-21, -5.16815050e-21])) 
      fun: -5.1684582072826815e-21 
     message: 'Optimization terminated successfully.' 
      nfev: 47 
      nit: 24 
     status: 0 
     success: True 
      x: array([ 6.00002802, 0.60020636]) 

CHISQ_TOT = 259.042420419 CHISQ_RED = 3.36418727816 

CG最小化メソッドを実行すると、以下の出力が生成されます。

 fun: -4.0964504680695594e-97 
    jac: array([ 8.72867710e-94, -3.96555507e-93]) 
message: 'Optimization terminated successfully.' 
    nfev: 4 
    nit: 0 
    njev: 1 
    status: 0 
success: True 
     x: array([ 6.01921293, 0.54436257]) 

CHISQ_TOT = 683.781671477 CHISQ_RED = 8.88028144776 

しかし、higher chi square value looks like a better fit(ヒストグラムで同じデータセット)とのフィット感。

問題は、すべての最小化の方法が私の推測パラメータ(muとsigma)を最適化されたパラメータとして出力することです。 Nelder-Mead法(より小さなカイ2乗、劣悪なフィット)は47回の関数評価と24回の反復を持ち、CG法(より大きなカイ2乗、見た目の良いフィット)は4回の関数評価と0回の反復を有する。私はchisq3が最小化されているmuとsigmaの事前定義された関数である(最小化機能に余分な引数を追加することによって、これを変更しようとした、とparameterguess[mu_guess, sigma_guess]ある。

minimize(chisq3 , parameterguess , method = 'CG', options={'gtol':1e-50, 'maxiter': 100}) 

私はムーの私の推測値を変更した場合と、シグマを2つずつ追加すると、フィットが大幅に悪化します(最適化されたパラメータの推測値はむしろまともです)。関連性があるかどうかはわかりませんが、プロットに表示されるデータは、私のデータセットの各値の対数を取って、 "疑似"ガウス形状/分布(対数x軸上)を作成します。

私は、 scipyを介して関数をnimize 本当に成功するために多くの反復を行うことになっています。だから私はより多くの反復を追加すると、私の最初のパラメータの推定に最小関数の感度を減らすべきだと思います。

これはscipy経由でminimize関数を使用するのが一般的なエラーですか?もしそうなら、いくつかの一般的な修正がありますか?また、なぜminimize関数は入力と同じ結果を出すだけの多くの反復と関数評価を行うのでしょうか?

+0

おそらくコードなしではあまり助けになりません。テキストはまた、一種の難しいです。 '' 'scipyによる最小化関数が多くの反復を真に成功させることになっていると推測しています。だから私は、より多くの反復を追加することは、私の最初のパラメータ推測に最小関数の感度を下げるべきだと思っています。 " - これはここで使用している最適化メソッドの深い誤解を示しています。この動作は、Metaheuristicsに適合するかもしれませんが、ここでは(少なくともローカルコンバージェンスを達成しようとする)高度に形式化されたアルゴリズムではないでしょう。 – sascha

答えて

0

問題は、カイ2乗は期​​待値と観測値のbinごとの差の2乗の合計を期待値で割ったものに等しい計算であるということでした。その結果、少数を大きな数で割って2乗した後、何千回も連続して合計し、除算の問題や誤差を打ち消すことに貢献しました。分母項を持たないカイ2乗などの単純な関数を最小化することによって、バグの原因がなくなり、得られたパラメータ適合からカイ二乗を計算することができる。

関連する問題