使用scipy.optimize出现'numpy.float64'对象不可调用错误,原因是什么?
scipy.optimize调用报
'numpy.float64' object is not callable的常见原因 所有这类报错的核心原因都是:优化器预期接收一个可调用的函数对象作为输入的位置,你实际传入了一个numpy.float64类型的数值。在scipy.optimize的使用场景下,常见触发场景如下:
- 目标函数传参错误:你把提前计算好的目标函数值传给了优化器,而不是函数本身。
错误示例:
正确写法:# 错误写法:第一个参数提前执行了func(x0)得到的是浮点数值 res = spo.minimize(func(x0), x0=x0, bounds=bounds)# 正确写法:第一个参数传入函数本身,优化器会内部自动调用 res = spo.minimize(func, x0=x0, bounds=bounds) - 变量名冲突:你定义的目标函数名被后续的浮点数值覆盖了。比如你先定义了
def loss(x): return np.sum(x**2),后续又写了loss = np.mean(arr)这类代码,把loss变量从函数对象变成了float64数值,再传loss给优化器就会报错。 - 带额外参数的目标函数传参错误:如果你的目标函数需要除优化变量之外的额外参数,直接执行函数传参相当于提前求值得到数值。
错误示例:
正确写法:用args参数传递额外参数,或者用lambda包装def loss(x, a, b): return a * x**2 + b a, b = 2, 3 # 错误写法:提前执行得到的是数值 res = spo.minimize(loss(x, a, b), x0=1)# 写法1:用args传参 res = spo.minimize(loss, x0=1, args=(a, b)) # 写法2:lambda包装 res = spo.minimize(lambda x: loss(x, a, b), x0=1) - 导数类参数传参错误:如果你手动指定了jac(梯度)、hess(海森矩阵)等参数,同样需要传入可调用函数,如果传入提前计算好的数值,也会触发相同报错。
你可以在调用优化接口前加一行print(type(你传入的目标函数变量名))快速验证,如果输出为<class 'numpy.float64'>,即可确认是上述的传参或者变量覆盖问题。
内容的提问来源于stack exchange,提问作者vethraut
相关产品推荐
相关产品推荐

