2012-04-28 96 views
0

我想盡量減少使用scipy.optimize.fmin的khi-square。 這是我的功能,(其中調用了其他仿真函數spotdiffusion)。 返回值(CHI)是二KHI值的數組(一個用於全等條件,其它爲不一致條件),我試圖最小化:python的函數scipy.optimize.fmin

def chis (a, ter , v , sda , rd): 

    ncond=1 
    ntrials = 1000 
    observed_data = np.array ([ [0.9995835, 24.0, 329.5, 357.9, 370.5, 391.5, 457.6, 0.0004164931, 0, 0],#congruent cond 
           [0.6953498, 16, 409.5, 450.5, 481, 529, 546 , 0.3046502 , 7 ,350]])#incongruent cond 

    q_probs=np.array ([.1,.2,.2,.2,.2,.1]) 
    b_probs=np.array([0.501,0.499]) 

    cond = np.arange (0, ncond) 
    chi = [] 
    for g in cond: 
     if(g==0): 
      fl= 1.0 #flankers congruent with target  
     if(g==1): 
      fl= -1.0 # incongruent 

     ######### 
     simTRcorrect, simTRerror, simprobc, simprobe = spotdiffusion (a ,ter ,v, sda,rd ,fl, ntrials = 1000) 
     #########   
     top_data = observed_data[g,0]*q_probs 
     bot_data=observed_data[g,7]*b_probs  

     pt1 = (len (simTRcorrect [simTRcorrect < observed_data[g, 2]])) /ntrials 
     pt2 = (len (simTRcorrect [(simTRcorrect < observed_data[g, 3]) & (simTRcorrect >= observed_data[g, 2])])) /ntrials 
     pt3 = (len (simTRcorrect [(simTRcorrect < observed_data[g, 4]) & (simTRcorrect >= observed_data[g, 3])])) /ntrials 
     pt4 = (len (simTRcorrect [(simTRcorrect < observed_data[g, 5]) & (simTRcorrect >= observed_data[g, 4])])) /ntrials 
     pt5 = (len (simTRcorrect [(simTRcorrect < observed_data[g, 6]) & (simTRcorrect >= observed_data[g, 5])])) /ntrials 
     pt6=(len (simTRcorrect [simTRcorrect > observed_data[g, 6]])) /ntrials 

     pred_p= np.array ([pt1,pt2,pt3,pt4,pt5,pt6]) 
     top_chi_array = (np.square (top_data-pred_p))/ (pred_p+ 0.001) 
     top_chi = np.sum (top_chi_array) 


     pt1 = (len (simTRerror[simTRerror < observed_data[g, 9]])) /ntrials 
     pt2 = (len (simTRerror[simTRerror >= observed_data[g, 9]])) /ntrials 

     pred_p=np.array ([pt1,pt2]) 
     bot_chi_array = (np.square (bot_data-pred_p))/(pred_p+ 0.001) 
     bot_chi= np.sum (bot_chi_array) 

     totchi=(bot_chi+top_chi)*(observed_data[g,1]+ observed_data[g,8]) 


     chi.append (totchi) 


    chi = np.array (chi)  
    return chi 

這裏是擬合程序:

x0 = np.array ([0.11, 0.25,0.35,1.7,0.017]) ####for initial guess 
xopt = fmin (chis(a, ter , v , sda , rd), x0, maxiter=300) 

我有一個錯誤,我不明白:

Traceback (most recent call last): 
    File "<ipython console>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\startup.py", line 128, in runfile 
    execfile(filename, glbs) 
    File "C:\Users\mathieu\Desktop\modeling\spotlight diffusion model\fitting_spotlight.py", line 245, in <module> 
    xopt = fmin (chis(a, ter , v , sda , rd), x0, maxiter=300) 
    File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 257, in fmin 
    fsim[0] = func(x0) 
    File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 176, in function_wrapper 
    return function(x, *args) 
TypeError: 'numpy.float64' object is not callable 

有沒有人有什麼錯誤的想法?

乾杯, 墊

回答

2

的問題是在這條線:

xopt = fmin (chis(a, ter , v , sda , rd), x0, maxiter=300) 

表達

chis(a, ter , v , sda , rd) 

是最有可能的數。這是調用函數chis的結果。

相反,我們想通過函數對象chisfmin功能,而不必叫chis第一。 (如果我們通過chis(a, ter, v, sda, rd)然後fmin只是得到一個數字作爲第一個參數。如果我們通過函數對象chis本身,然後fmin可以調用chis需要怎麼過來自fmin。 在Python身體內,職能是第一代。類對象

所以會轉而

xopt = fmin (chis, x0, maxiter=300) 
0

的問題似乎是兩個 - 在行:

xopt=fmin(chis(a,ter,v,sda,rd),x0,maxiter=300) 

這應該是作爲先前用戶提到

xopt=fmin(chis,x0,maxiter=300) 

而且在開始的時候,其中功能已被定義,參數應被給定爲陣列

代替

def chis (a, ter , v , sda , rd): 

嘗試:

def chis (arrays): 

    a=arrays[0] 
    ter=arrays[1] 
    v=arrays[2] 
    sda=arrays[3] 
    rd=arrays[4]