试图了解如何使用scipy.optimize?

时间:2017-10-05 04:49:22

标签: python

我正在尝试使用stats.optimize.minimize函数。首先,我正在尝试一些非常简单的事情。

我定义:

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

我试图看看最小化是否会给我正确的MLE,即k/n == p

然后我尝试:

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])

我做错了什么?

1 个答案:

答案 0 :(得分:0)

一些变化:

  1. 为此问题选择更合适的最小化方法。当没有提供约束或边界时,最小化函数默认为BFGS方法,这是一种无约束优化的方法。它失败是因为它试图评估p> p值的函数。 1.你可以提供一些合理的界限,或者我在这里发现使用TNC方法适用于这种情况。
  2. 函数参数的顺序应为(p,n,k)
  3. 您希望最大化日志,或等效地最小化日志的否定。
  4. 代码:

    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])