многопараметрическая оптимизация со скучными и экспериментальными данными - PullRequest
0 голосов
/ 25 мая 2018

Я занимаюсь некоторым служебным моделированием, но застрял, пытаясь оптимизировать свою целевую функцию, и не понимаю проблемы.

У меня есть вспомогательная функция (1), которая принимает экспериментальные данные в качестве аргументов, а также два параметра (тэта и фи), с помощью которых я хочу оптимизировать функцию (1).Функция возвращает оптимальный выбор с учетом вышеупомянутых комбинаций данных и параметров.

Целевая функция (2) - это, как правило, сумма квадратов невязок (SSE), которая принимает функцию (1) в качестве входных данных и определяет, насколько хорошо оптимальный выбор из функции (1) выполняется по отношению к фактическим данным.

Здесь все идет не так.Я пытаюсь оптимизировать функцию 2 в отношении параметров тэта и фи.Вот код:

from scipy.optimize import minimize
    def costmixed(theta,phi,data):
    predictions = []
    for trialNr,trialDat in data.iterrows():
        predictions.append(mixed_model( 
        trialDat['inv'],trialDat['mult'],trialDat['belMult'],theta,phi))

    return np.sum(np.square(data['ret'] - np.array(predictions))) #returns sum of squared residuals.
#initial guesses
x0=[1000,0.5]
sol=minimize(costmixed,x0,args=[data],bounds=bnds)

И следующие ошибки, которые я получаю:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-46-87cded55e0f8> in <module>()
      7     return np.sum(np.square(data['ret'] - np.array(predictions))) #returns sum of squared residuals.
      8 
----> 9 sol=minimize(costmixed,x0,args=[data],bounds=bnds)

C:\ProgramData\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    448     elif meth == 'l-bfgs-b':
    449         return _minimize_lbfgsb(fun, x0, args, jac, bounds,
--> 450                                 callback=callback, **options)
    451     elif meth == 'tnc':
    452         return _minimize_tnc(fun, x0, args, jac, bounds, callback=callback,

C:\ProgramData\Anaconda3\lib\site-packages\scipy\optimize\lbfgsb.py in _minimize_lbfgsb(fun, x0, args, jac, bounds, disp, maxcor, ftol, gtol, eps, maxfun, maxiter, iprint, callback, maxls, **unknown_options)
    326             # until the completion of the current minimization iteration.
    327             # Overwrite f and g:
--> 328             f, g = func_and_grad(x)
    329         elif task_str.startswith(b'NEW_X'):
    330             # new iteration

C:\ProgramData\Anaconda3\lib\site-packages\scipy\optimize\lbfgsb.py in func_and_grad(x)
    271     if jac is None:
    272         def func_and_grad(x):
--> 273             f = fun(x, *args)
    274             g = _approx_fprime_helper(x, fun, epsilon, args=args, f0=f)
    275             return f, g

C:\ProgramData\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in function_wrapper(*wrapper_args)
    290     def function_wrapper(*wrapper_args):
    291         ncalls[0] += 1
--> 292         return function(*(wrapper_args + args))
    293 
    294     return ncalls, function_wrapper

TypeError: costmixed() missing 1 required positional argument: 'data'

Я надеюсь, что вы, волшебники, сможете мне помочь!Я новичок в Python, поэтому я могу упустить что-то довольно простое.Заранее спасибо.

1 Ответ

0 голосов
/ 01 июня 2018

Я понял это в конце концов!Функция наименьших квадратов (или любая из функций оптимизации в scipy, на мой взгляд) принимает только один аргумент оптимизации.Это не означает, что n параметров не могут быть добавлены;это означает, что когда вы определяете функцию стоимости / цели, вы должны определить один параметр в виде списка.

def function(params,data):
     theta, phi = params
     utility = p2*theta - (1-theta)*np.minimum((guilt + phi), (inequity - phi))
return utility

альтернативная конструкция

def function(params,data):
     utility = p2*params[0]- (1-params[0])*np.minimum((guilt + params[1]), (inequity - params[1]))
return utility

Надеюсь, это поможет.Обратите внимание, что приведенная выше функция на самом деле не может свести к минимуму, это случайная функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...