使用scipy和实验数据进行多参数优化

时间:2018-05-25 14:36:10

标签: python optimization scipy

我正在做一些实用程序建模但是在尝试优化我的目标函数时遇到困难而我不明白这个问题。

我有一个实用函数(1),它将实验数据作为参数以及两个参数(theta和phi),我想用它来优化函数(1)。给定上述数据和参数组合,该函数返回最佳选择。

目标函数(2)基本上是平方残差之和(SSE),它将函数(1)作为输入,并确定函数(1)的最佳选择与实际数据的匹配程度。

这是出问题的地方。我尝试在参数theta和phi方面优化函数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 :(得分:0)

我终于明白了! least_squares函数(或者我认为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

希望这会有所帮助。请注意,上面的函数实际上可能不会最小化,它是一个随机函数。