我正在做一些实用程序建模但是在尝试优化我的目标函数时遇到困难而我不明白这个问题。
我有一个实用函数(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的新手,所以我可能会遗漏一些非常简单的东西。提前致谢。
答案 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
希望这会有所帮助。请注意,上面的函数实际上可能不会最小化,它是一个随机函数。