例外:'numpy.float64'对象在优化时不可调用

时间:2017-04-08 12:50:48

标签: python scipy minimize

我一直在

异常:'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

2 个答案:

答案 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示例,以更好地了解如何使用此函数。