У меня есть функция отрицательного логарифмического правдоподобия, чтобы минимизировать. Я хочу установить массив наблюдений как параметр функции для оптимизации, а не напрямую в функцию, но, как ни странно, оптимизатор взрывается. Может кто-нибудь объяснить мне, почему, и в конечном итоге сказать мне, что изменить, чтобы иметь сходящийся оптимизатор?
Я установил наблюдения как параметры функции следующим образом:
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])
Даже если оптимизатор не считает это успехом.