Функция максимизации с двумя параметрами - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь найти значения двух параметров, называемых a e b , которые максимизируют функцию f (x, a, b), с b> 0. Я написал это:

a=0.1 #start value for a
b=150 #start value for b
n=len(x)
def f(y,a,b):
    c=sum([np.log(1-a/b*i) for i in y])
    return -n*np.log(b)+(1-a/a)*c
minimize(f,x,args=(a,b))

где x - массив с моими данными.

Я получаю следующую ошибку:

RuntimeWarning: invalid value encountered in log
  c=sum([np.log(1-a/b*i) for i in x])
C:\Python27\lib\site-packages\numpy\core\_methods.py:26: RuntimeWarning: invalid value encountered in reduce
  return umr_maximum(a, axis, None, out, keepdims)
      fun: nan
 hess_inv: array([[1, 0, 0, ..., 0, 0, 0],
       [0, 1, 0, ..., 0, 0, 0],
       [0, 0, 1, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 1, 0, 0],
       [0, 0, 0, ..., 0, 1, 0],
       [0, 0, 0, ..., 0, 0, 1]])
      jac: array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan, nan])
  message: 'Desired error not necessarily achieved due to precision loss.'
     nfev: 97
      nit: 0
     njev: 1
   status: 2
  success: False

Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Для этой проблемы, поскольку вы ищете оптимальные значения a, b, ваша цель должна быть переопределена следующим образом:

def f(x,y):
    a = x[0] # Parameter 1
    b = x[1] # Parameter 2
    c=sum([np.log(1-a/b*i) for i in y])
    return -n*np.log(b)+(1-a/a)*c
minimize(f,x,args=(y))

Далее необходимо выполнить проверку, чтобы убедиться, что np.log получает value > 0.0, в противном случае вы получите ошибку домена. Вы можете вычислить границы значения a w.r.t b или наоборот, а затем указать bounds.

0 голосов
/ 18 января 2019

Попробуйте установить границы с помощью свойства bounds, равного minimize(). Вероятно, ваш b становится отрицательным в одной точке.

...