我一直在
异常:'numpy.float64'对象不可调用
尝试最小化功能时。
我可以调用我想要最小化的函数
def testLLCalc():
mmc = MortalityModelCalibrator()
a = mmc.log_likelihood(2000, np.array([[0.6, 0.2, 0.8]]))
但是当我尝试通过
来最小化它时x0 = np.array([0, 0, 0])
res = minimize(-a[0], x0)
我得到了上面的例外。任何帮助,将不胜感激。完整的追溯是:
Error
Traceback (most recent call last):
File "C:\Program Files (x86)\JetBrains\WinPython-64bit-3.5.3.0Qt5\python-3.5.3.amd64\lib\unittest\case.py", line 59, in testPartExecutor
yield
File "C:\Program Files (x86)\JetBrains\WinPython-64bit-3.5.3.0Qt5\python-3.5.3.amd64\lib\unittest\case.py", line 601, in run
testMethod()
File "C:\Program Files (x86)\JetBrains\WinPython-64bit-3.5.3.0Qt5\python-3.5.3.amd64\lib\site-packages\nose\case.py", line 198, in runTest
self.test(*self.arg)
File "C:\Users\Matt\Documents\PyCharmProjects\Mortality\src\PennanenMortalityModel_test.py", line 57, in testLLCalc
res = minimize(-a[0], x0)
File "C:\Program Files (x86)\JetBrains\WinPython-64bit-3.5.3.0Qt5\python-3.5.3.amd64\lib\site-packages\scipy\optimize\_minimize.py", line 444, in minimize
return _minimize_bfgs(fun, x0, args, jac, callback, **options)
File "C:\Program Files (x86)\JetBrains\WinPython-64bit-3.5.3.0Qt5\python-3.5.3.amd64\lib\site-packages\scipy\optimize\optimize.py", line 913, in _minimize_bfgs
gfk = myfprime(x0)
File "C:\Program Files (x86)\JetBrains\WinPython-64bit-3.5.3.0Qt5\python-3.5.3.amd64\lib\site-packages\scipy\optimize\optimize.py", line 292, in function_wrapper
return function(*(wrapper_args + args))
File "C:\Program Files (x86)\JetBrains\WinPython-64bit-3.5.3.0Qt5\python-3.5.3.amd64\lib\site-packages\scipy\optimize\optimize.py", line 688, in approx_fprime
return _approx_fprime_helper(xk, f, epsilon, args=args)
File "C:\Program Files (x86)\JetBrains\WinPython-64bit-3.5.3.0Qt5\python-3.5.3.amd64\lib\site-packages\scipy\optimize\optimize.py", line 622, in _approx_fprime_helper
f0 = f(*((xk,) + args))
File "C:\Program Files (x86)\JetBrains\WinPython-64bit-3.5.3.0Qt5\python-3.5.3.amd64\lib\site-packages\scipy\optimize\optimize.py", line 292, in function_wrapper
return function(*(wrapper_args + args))
Exception: 'numpy.float64' object is not callable
答案 0 :(得分:0)
scipy的minimize期望可调用函数作为第一个参数。
由于你没有显示完整的代码,所以这只是一个猜谜游戏,但是这个
res = minimize(-a[0], x0)
必须表示 a 的第一个元素应该是一个函数。
看到这一行:
a = mmc.log_likelihood(2000, np.array([[0.6, 0.2, 0.8]]))
它看起来不像那样可能会返回一个标量。
效果很简单:scipy希望用一些参数(开头的x0)调用这个给定的函数,但是在你的情况下用一些参数调用一些numpy-array值(当然这是无效的)。
答案 1 :(得分:0)
查看文档:
minimize(fun, x0, args=(),...
fun : callable
Objective function.
x0 : ndarray
Initial guess.
args : tuple, optional
Extra arguments passed to the objective function and its derivatives
你知道'可赎回'是什么吗?它是一个函数(或等价函数),可以使用fun(x0, arg0, arg1, ...)
“调用”。
错误告诉我们-a[0]
是numpy数组的元素a
。
目前尚不清楚您是否尝试最小化此功能,或者这是否是使用minimize
的一部分。它不能是a
的来源,因为它不会返回任何内容。
def testLLCalc():
mmc = MortalityModelCalibrator()
a = mmc.log_likelihood(2000, np.array([[0.6, 0.2, 0.8]]))
# return a ????
所以 - 回顾一下你对基本Python的理解,特别是“可调用”的概念。并运行一些minimize
示例,以更好地了解如何使用此函数。