2017-10-05 12 views
0

私はstats.optimize.minimize関数を使用しようとしています。まず、私は非常に簡単なことを試しています。scipy.optimizeの使い方を理解しようとしていますか?

私は定義:

lik1 = lambda n,k,p: math.log(stats.binom.pmf(k,n,p)) 

私は最小化が私に、k/n == pで正しいMLEを与えるかどうかを確認しようとしています。

それから私は試してみてください。

optimize.minimize(lik1, 0.5, args=(10,2)) 

私はn == 10k == 2を想定していますし、pのための私の推測(引数x0が)0.5です。次のエラーが表示されます。

 fun: nan 
hess_inv: array([[1]]) 
     jac: array([ nan]) 
    message: 'Desired error not necessarily achieved due to precision loss.' 
    nfev: 3 
     nit: 0 
    njev: 1 
    status: 2 
    success: False 
     x: array([ 0.5]) 

私は間違っていますか?

答えて

0

いくつかの変更:

  1. この問題のために、より適切な最小化法を選択します。最小化関数は、制約のない最適化のための方法である制約または境界がない場合、BFGSメソッドをデフォルトにします。これは、p> 1の値の関数を評価しようとするため失敗します。ある程度の合理的な範囲を提供することもできますし、ここではTNCメソッドを使用することができます。
  2. 関数の引数の順番は、(p、n、k)にする必要があります。
  3. ログを最大化するか、同等にログの負数を最小限にする必要があります。

コード:

import scipy as sp 
import scipy.stats 
import scipy.optimize 

lik1 = lambda p, n, k: -sp.log(sp.stats.binom.pmf(k, n, p)) 
res = sp.optimize.minimize(lik1, 0.5, args=(10, 2), method='TNC') 
print(res) 

出力:

 fun: array([ 1.19736175]) 
    jac: array([ 1.22124533e-05]) 
message: 'Converged (|f_n-f_(n-1)| ~= 0)' 
    nfev: 10 
    nit: 4 
    status: 1 
success: True 
     x: array([ 0.20000019]) 
+0

私は別の方法から選択する方法を理解しようとしていますか? scipy.optimize documentationには、使用できるさまざまなメソッドがリストされていますが、メソッドの詳細は記載されていません。たとえば、L-BFGS-Bでは、LとBは何を表しますか? – Arjun

+0

scipyは、あるレベルの方法と理論に精通しているので、問題に適した方法を選択できます。すべての問題に対して単一の最良の方法はなく、さまざまな方法が特定の種類の問題に適しています。メソッド名を検索すると、多くのオンラインリソースがあります。 L-BFGS-Bについては、https://en.wikipedia.org/wiki/Limited-memory_BFGS#L-BFGS-Bを参照してください。 –

関連する問題