2017-04-08 65 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函數又會返回返回標量的另一個函數。 –