Python scipy.minimize-“最小化”;TypeError:numpy.float64';对象不可调用正在运行“;

Python scipy.minimize-“最小化”;TypeError:numpy.float64';对象不可调用正在运行“;,python,numpy,compiler-errors,scipy,minimize,Python,Numpy,Compiler Errors,Scipy,Minimize,运行scipy.minimize函数“I get TypeError:'numpy.float64'对象不可调用”。具体而言,在执行: .../scipy/optimize/optimize.py", line 292, in function_wrapper return function(*(wrapper_args + args)) 我已经在这里查看了以前的类似主题,通常出现此问题的原因是,作为.minimize的第一个输入参数不是 功能。我很难理解,因为“a”是函数。 你觉得怎

运行scipy.minimize函数“I get TypeError:'numpy.float64'对象不可调用”。具体而言,在执行:

    .../scipy/optimize/optimize.py", line 292, in function_wrapper
return function(*(wrapper_args + args))
我已经在这里查看了以前的类似主题,通常出现此问题的原因是,作为.minimize的第一个输入参数不是 功能。我很难理解,因为“a”是函数。 你觉得怎么样

    ### "data" is a pandas data frame of float values
    ### "w" is a numpy float array i.e. [0.11365704 0.00886848 0.65302202 0.05680696 0.1676455 ]

    def a(data, w):
        ### Return a negative float value from position [2] of an numpy array of float values calculated via the "b" function i.e -0.3632965490830499 
        return -b(data, w)[2]

    constraint = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})

    ### i.e ((0, 1), (0, 1), (0, 1), (0, 1), (0, 1))
    bound = tuple((0, 1) for x in range (len(symbols)))

    opts = scipy.minimize(a(data, w), len(symbols) * [1. / len(symbols),], method = 'SLSQP', bounds = bound, constraints = constraint)
简短回答 它应该是:

opts = scipy.minimize(a, len(symbols) * [1. / len(symbols),], args=(w,), method='SLSQP', bounds=bound, constraints=constraint)
细节
a(data,w)
不是函数,而是函数调用。换句话说,
a(data,w)
有效地具有函数
a
的返回值的值和类型
minimize
需要不带调用的实际函数(即不带括号的
(…)
和介于两者之间的所有内容)作为其第一个参数

从:

scipy.optimize.minimize(fun,x0,args=(),method=None,jac=None,hess=None,hessp=None,bounds=None,constraints=(),tol=None,callback=None,options=None)

乐趣:可呼叫

要最小化的目标函数。格式必须为f(x,*args)。优化参数x是点的一维数组,args是完全指定函数所需的任何附加固定参数的元组

args:tuple,可选

传递给目标函数的额外参数


因此,假设
w
是固定的(至少相对于您想要的最小化),您将通过
args
参数将其传递给
minimize
,正如我在上面所做的那样。

您没有传递函数,而是传递要最小化的评估结果

opts = scipy.minimize(a,  len(symbols) * [1. / len(symbols),], method = 'SLSQP', bounds = bound, constraints = constraint, args = (data,w))
应该有用


编辑:修复了愚蠢的语法错误。

基本上,问题是
a(data,w)
是函数调用,而不是函数。仅仅
a本身就是一个函数,即不带括号
(…)
第99行opts=opt.minimize(a,args=(数据,w),len(符号)*[1./len(符号),],method='SLSQP',bounds=bound,constraints=constraint)^SyntaxError:位置参数跟在关键字参数之后
这是输出。语法无效。您需要交换
args=(数据,w)
len(符号)*[1./len(符号),]
。另外,它应该是
args=(w,)
minimize
需要能够自由操作
a
第99行opts=opt的第一个参数。minimize(a,args=(数据,w),len(符号)*[1./len(符号),],method='SLSQP',bounds=bound,constraints=constraint)^SyntaxError:位置参数跟在关键字参数之后
这是输出。@Nipper看起来您使用的是Raubtaube的答案,该答案的语法无效(这就是您收到错误消息的原因)。试试我贴的。对不起,我没有仔细阅读。正如您建议的那样,结果是
line 99 opts=opt.minimize(a,len(符号)*[1./len(符号),],args=(,权重),method='SLSQP',bounds=bound,constraints=constraint)^SyntaxError:无效语法
我需要交换args中w的位置,因为b函数的第一个输入是数据,它是一个数据帧(b函数无法对作为numpy.array的w执行诸如.shift()之类的操作)。@Nipper您不需要交换
w
的位置,
minimize
将为您执行该操作。
args=(,weights)
也是无效的Python语法。
len(符号)*[1./len
是您对
数据的初始猜测
最小化
不需要其他任何东西。它知道
args
中的第一个条目应该是传递给
a
opts=opt.minimize(a,len(符号)*[1./len(符号),],args=(w,),method='SLSQP',bounds=bound,constraints=constraint)错误行16,在b r1d=np.log(data/data.shift(1))AttributeError中:“numpy.ndarray”对象没有属性“shift”