2017-04-08 55 views
0

时,我不断收到例外:优化

异常“numpy.float64”对象不是可调用:试图最小化功能时,“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

SciPy的的minimize预计可调用的函数作为第一个参数。

由于您没有显示你的完整代码,它只是一个猜谜游戏在这里,但这个

res = minimize(-a[0], x0) 

有意味的一个的第一要素应该是一个功能。

见此行:

a = mmc.log_likelihood(2000, np.array([[0.6, 0.2, 0.8]])) 

它看起来并不像,由于可能会返回一个标量。

效果很简单:scipy希望用一些参数(x0在开头)调用这个给定的函数,但在你的情况下用一些参数调用一些numpy-array值(当然这是无效的)。

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的理解,特别是'callable'的概念。并运行一些minimize示例,以更好地了解如何使用此功能。

+0

log_likelihood是定义的函数:DEF log_liklihood'(个体,年,V):(V) 返回mm.log_liklihood(self.populationData,self.deathRateData,年 毫米= self.create_mortality_model() mm.set_v )'。它之前返回了2个标量的元组,因此我为此编制了索引;我现在删除了其中的一个,所以它应该只返回一个标量,但它仍然不起作用。 –

+0

但是你最小化的功能是什么? '函数',而不是标量或元组。 – hpaulj

+0

那么,log_likelihood函数又会返回返回标量的另一个函数。 –