scipy.minimize报TypeError: numpy.float64不可调用问题求助
踩过这个坑的过来人告诉你,虽然你确认传入的a是函数,但还是有几个容易忽略的细节会触发这个报错,咱们一个个排查:
不小心给函数加了括号:这是最常见的失误!如果你调用时写成了
scipy.minimize(a(), ...)而不是scipy.minimize(a, ...),那a()执行后返回的数值(比如numpy.float64)就会被当成目标函数传入,自然会报“不可调用”的错。哪怕你对a是函数这件事很确定,也再检查一遍调用时的写法,手滑加括号真的太容易了。函数内部被意外覆盖:看看你的
a函数定义里有没有重名的变量?比如在函数内部写了a = data['some_column'].mean()这类代码,这会把函数a本身覆盖成一个数值。后续调用时,a就不再是可调用的函数了。变量被提前赋值覆盖:在调用
scipy.minimize之前,有没有其他代码把a重新赋值成了数值?比如之前执行过a = np.sum(data['value']),这时候a已经是numpy.float64类型了。你可以在调用前加一句print(type(a)),确认输出是<class 'function'>而不是<class 'numpy.float64'>。目标函数签名不符合要求:scipy.minimize要求第一个参数(目标函数)必须接受一个数组类型的优化变量,并返回一个标量。如果你的
a函数签名不对,或者没有正确传递额外参数,可能会在内部调用时出现异常,间接导致这个报错。你可以先单独测试a(x0)(x0是你的初始猜测值),看能不能正常返回一个标量数值。
举个正确用法的例子,你可以对照着检查自己的代码:
import scipy.optimize as opt import pandas as pd import numpy as np data = pd.DataFrame({'x': [1,2,3], 'y': [4,5,6]}) # 正确的目标函数:接受优化变量x(数组),返回标量损失值 def a(x): return np.sum((data['y'] - (x[0]*data['x'] + x[1]))**2) x0 = [0, 0] # 初始猜测值 result = opt.minimize(a, x0)
先从这几个点入手排查,应该能找到问题所在!
内容的提问来源于stack exchange,提问作者Nipper

