2017-02-20 1 views
1

私はシンプレックスアルゴリズム(scipy.optimize.fmin)のpython実装でカイ二乗損失関数を最小化することによって、4パラメータ(a、g、Nおよびk)モデルをデータに適合させたいと思います。予備シミュレーションでは、各パラメータの次の範囲が示唆されます。a = [5、50]、g = [0.05,1.5]、N = [5,200]、およびk = [0,0.05]。scipy.optimize.fmin(Simplex)は、さまざまな大きさに関連付けられたパラメータをどのように処理しますか?

scipy.optimize.fmin関数は、パラメータがすべて同じ範囲(おそらく[0、1])にあるかのように扱われます。私はそれらを再調整すべきですか?以下は私のコードです:

#determine starting point (x0) for each parameter 
a = np.random.uniform(5,50) 
g = np.random.uniform(0.05, 1.5) 
N = np.random.uniform(5, 200) 
k = np.random.uniform(0, 0.05) 
x0 = np.array ([a, g, N, k]) #initial guess for SIMPLEX 

xopt = fmin (chis, x0, maxiter=1000)#call Simplex 
+0

'chis'関数は手作りですか?もしそうなら、私は最小化の目標を絶対的ではなく相対的なものにすることによって、その目標を再スケーリングするだろう。私は差異というよりもむしろバリエーションを使って作業することを意味します。 – Kanak

+0

もちろん、キス機能は自家製です。必要に応じてコードを提供することができます。より具体的になりますか?バリエーションを使って作業することは何を意味するのですか? – user1363251

+0

この質問には何が出てきましたか?たとえば、最小化するときの結果は? – Kanak

答えて

0

は、この例は現実的ではないとしても、それが主なポイントを強調あなたは以下の二変量の関数に

def to_min1((x,y)): 
    return abs(1e-15 - x) + abs(1e15 - y) 

を最小限にしたいことを想像してみてください。確かに、fminは、すでに0に非常に近いので、xx0=0の場合)に移動しません。

だから、1は、それらの変化の観点からではなく(ZeroDivisionErrorを避けるために、分母の引数で)差の観点になり、最適化プログラム内の同じ重みを持つ目標を取得するように:

def to_min2((x,y)): 
    return abs(-1+x/1e-15) + abs(-1+y/1e15) 

。なお、そうすることによって、反復的な再計算がすべての引数に対して均等に重み付けされることが望まれるため、これはftolの懸念事項です。

あなたの質問に正確に答えるのではなく、次のように答えてください: scipy.optimize.fmin(Simplex)は、さまざまな大きさに関連付けられたパラメータを扱いますか?

どうやら無

、確認のために

>>> fmin(to_min2, (0,0)) 
Optimization terminated successfully. 
     Current function value: 1.000000 
     Iterations: 118 
     Function evaluations: 213 
array([ 1.00000000e-15, 8.98437500e-05]) 

Optimizationterminate successfully.なかった、と

>>> fmin(to_min1, (0,0)) 
Optimization terminated successfully. 
     Current function value: 1000000000000000.000000 
     Iterations: 3 
     Function evaluations: 11 
array([ 0., 0.]) 

ながらそれはfminさんなどmaxiter引数を増やすことによって行うことができるので、...しかし、 2つのケースは明らかに同じ方法で管理されていません。

関連する問題