2015-10-15 57 views
1

我不斷收到numpy.ndarray對象不可調用的錯誤。我知道這個錯誤發生是因爲使用np.array而不是函數。在我的代碼中的問題是,我的確在使用一個函數來運行python函數minimize'numpy.ndarray'對象在使用CALLABLE函數進行最小化時無法調用

有人能讓我知道發生了什麼嗎?

的代碼是在這裏:

# -*- coding: utf-8 -*- 
""" 
Created on Thu Oct 15 06:27:54 2015 


""" 

# -*- coding: utf-8 -*- 
""" 
Created on Mon Oct 12 20:22:27 2015 


""" 

# Midterm Macroeconometrics 

import numpy as np 
from numpy import log 
import numpy.linalg as linalg 
from scipy import * 
from scipy.optimize import fminbound, broyden1, brentq, bisect, minimize 
from scipy import interp 
import pylab as pl 
#from numdifftools import Gradient, Jacobian, Derivative 
import matplotlib.pyplot as plt 
import pandas as pd 
from mpl_toolkits.mplot3d import axes3d 
from matplotlib import cm 
import scipy.io as sio 
import os 

""" 
IMPORTING DATA FROM PANDAS 

""" 
#Importing data from text file- using Pandas. 
os.chdir(r'/Users/camilahenao/Dropbox/UIUC Phd Econ/Year 3/Fall/macroeconometrics shin/Homework/ps3-MIDTERM') 
os.path.abspath(os.path.curdir) 

data=pd.read_csv(r'midterm2015.csv', header= None) 
data.columns = ['GDP_I', 'GDP_E'] 
GDP_I=np.array(data.GDP_I) 
GDP_E=np.array(data.GDP_E) 

y= np.vstack((GDP_I,GDP_E)) 

def kalman2(a_old, p_old, Z, gamma, theta, y): 
    mu, rho, h_I, h_E, h_G = theta[0], theta[1], np.log(theta[2]), np.log(theta[3]), np.log(theta[4]) 
    sigma_I= np.exp(h_I) 
    sigma_E= np.exp(h_E) 
    sigma_G= np.exp(h_G) 

    H = np.array([[sigmaI,0],[0, sigmaE]]) 
    H=np.matrix(H) 
    list_a = np.array([a_old]) 
    list_p = np.array([p_old]) 
    list_f = np.array([]) 
    list_v = np.array([]) 
    log_likelihood_Y= np.array([ ]) 
    list_log_like_sum = np.array([]) 

    for i in range(y[0].size): 
     N=y.shape[0] 
     Time=y[0].size 
     inv= np.matrix(linalg.inv(Z*p_old*Z.T+H)) 
     cosa= Z.T*inv 
     temp= p_old*cosa 
     a_new= np.array(a_old +temp*(np.array([[y[0][i]],[y[1][i]]])-Z*a_old-gamma*w))[0] 
     list_a=np.hstack((list_a,a_new)) 

     p_new= np.array(p_old - temp* Z*p_old)[0] 
     list_p=np.hstack((list_p, p_new)) 

     #Transform the previous posterior into prior- 
     a_old=T*a_new 
     a_old=a_old[0] 
     p_old=T*p_new*T + R*Q*R #25 

     #Moments for log-likelihood: 
     f= np.linalg.det(Z*p_old*Z.T + H) 
     list_f= np.hstack((list_f,f)) 
     #print list_f 

     v= np.array([[y[0][i]],[y[1][i]]])-Z*a_old - gamma*w 
     v_element= np.array((v.T *np.matrix(np.linalg.inv(Z*p_old*Z.T + H)) *v))[0] 
     list_v=np.hstack((list_v,v_element)) 
     #print list_v 

     #Log likelihood function for each period of time: 
     log_like= (-N*(Time-1)/2*np.log(2*pi)-(1/2)*sum(log(list_f)) -(1/2)*sum(list_v)) 
     log_likelihood_Y=np.hstack((log_likelihood_Y, log_like)) 

     #Create the sum over all Time of the log-likelihood 
     log_like_sum=np.sum(log_likelihood_Y) 
     list_log_like_sum=np.hstack((list_log_like_sum, log_like_sum)) 

    return list_a, list_p, log_likelihood_Y, list_log_like_sum 

#Define the "callable function" 

def mle(a_old, p_old, Z, gamma, theta, y, bds): 
    a, P, py, py_sum = kalman2(a_old, p_old, Z, gamma, theta, y) 
    mle= -1*py_sum 

    return mle 

#Run the minimization algorithm 
theta2=(.8, 3.0, 5.0, 5.0, 5.0) 
a_old=0.0 
p_old= sigmaG/(1-rho**2) 
Z=np.array([[1.0],[1.0]]) 
gamma=np.array([[1.0],[1.0]]) 
bds = [[-10e100, 10e100], [-10e100, 10e100], [1e-6, 10e100], [1e-6, 10e100], [1e-6, 10e100]] 
theta_guess = [3, 0.8, np.sqrt(5), np.sqrt(5), np.sqrt(5)] 

result = minimize(mle(a_old, p_old, Z, gamma, theta, y, bds), theta_guess, bounds = bds) 
+1

你可以發佈完整的實際回溯錯誤,而不是試圖總結它嗎? – CoryKramer

+1

在'result = minimize(mle(a_old,p_old,Z,gamma,theta,y,bds),theta_guess,bounds = bds)'這一行中,第一個參數不是函數mle。它是由'mle(a_old,p_old,Z,gamma,theta,y,bds)'返回的值,這顯然是一個numpy數組。第一個參數應該是「mle」。 –

回答

1

沃倫Weckesser在評論中提到,要傳遞呼叫mle(a_old, p_old, Z, gamma, theta, y, bds)的結果 - 這是一個浮點值 - 作爲第一個參數minimize()功能。按照scipy documentation的第一個參數minimize()應該是一個可調用的函數,因此對於初學者你將需要改變通話它,所以它是這樣的:

result = minimize(mle, (a_old, p_old, Z, gamma, theta, y, bds), 
        theta_guess, bounds=bds) 

但是你要碰上新問題,因爲你的mle()函數不接受一個向量作爲它的第一個參數,這是你傳遞給minimize()的函數所需的 - 所以你也需要相應地修改它的定義。

不幸的是,我不明白你實際上想要完成什麼來建議你應該怎麼做。

相關問題