Scipy.minimize - " TypeError:numpy.float64'对象不可调用运行"

时间:2018-04-11 13:09:42

标签: python numpy compiler-errors scipy minimize

运行scipy.minimize函数"我得到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)

2 个答案:

答案 0 :(得分:2)

简短回答

应该是:

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 docs

  

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

     

...

     

fun:callable

     

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

     

...

     

args:元组,可选

     

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

因此,假设w已修复(至少就您所需的最小化而言),您可以通过minimize参数将其传递给args,就像我上面所做的那样。

答案 1 :(得分:1)

您没有传递函数,但评估结果最小化。

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

应该工作。

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