0

最小化する負の対数尤度関数があります。関数に直接ではなく、最適化する関数のパラメーターとして観測値の配列を設定したいのですが、奇妙なことに、オプティマイザーが爆発します。これがなぜなのかを知りたいと思っています。最終的には、最適化を収束させるために何を変更する必要があるかを理解したいと思っています。

この方法で観測値を関数のパラメーターとして設定します: mn は scipy.optimize.minimize を表します

def f(x, d ):
    alfa = x[0]
    lambda_ = x[1] 
    return - n * np.log(alfa) * lambda_ + alfa * sum(d) 

n = 2000 #number of observations 
y = np.random.exponential(2 , n) #vector of observations 

res = mn(f, x0 = [2,1/2], args = y)

結果は次のとおりです。

    fun: nan
 hess_inv: array([[0.67448386, 0.61331579],
       [0.61331579, 0.55866767]])
      jac: array([nan, nan])
  message: 'Desired error not necessarily achieved due to precision loss.'
     nfev: 452
      nit: 2
     njev: 113
   status: 2
  success: False
        x: array([-2947.66055677, -2680.19131049])

一方、パラメータとしてではなく内部的に観察を設定した場合

def f(x):
   alfa = x[0]
   lambda_ = x[1]
   n = 2000
   y = np.random.exponential(2 , n)
   return - n * np.log(alfa) * lambda_ + alfa * sum(y)

mn(f, x0 = [2,2])

私はいくつかのかなり良い見積もりを取得します

    fun: 5072.745186459168
 hess_inv: array([[ 3.18053796e-16, -1.07489375e-15],
       [-1.07489371e-15,  3.63271745e-15]])
      jac: array([1.65160556e+10, 1.11412293e+10])
  message: 'Desired error not necessarily achieved due to precision loss.'
     nfev: 122
      nit: 3
     njev: 28
   status: 2
  success: False
        x: array([1.99998635, 1.99999107])

オプティマイザーがそれを成功と見なさなくても。

4

1 に答える 1