我正在尝试使用scipy.optimize.fmin最小化khi-square。 这是我的函数,(调用其他模拟函数spotdiffusion)。 返回值(chi)是一个包含两个khi值的数组(一个用于全等条件,另一个用于不一致条件),我试图将其最小化:
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
有没有人知道出了什么问题?
干杯, 垫
答案 0 :(得分:2)
问题出在这一行:
xopt = fmin (chis(a, ter , v , sda , rd), x0, maxiter=300)
表达式
chis(a, ter , v , sda , rd)
很可能是数字。它是调用函数chis
的结果。
相反,我们希望将函数对象 chis
传递给fmin
函数,而不是先调用chis
。 (如果我们传递chis(a, ter, v, sda, rd)
,那么fmin
只会得到一个数字作为其第一个参数。如果我们传递函数对象chis
本身,那么fmin
可以调用chis
它是如何从fmin
的体内获得的。
在Python中,函数是第一类对象。
所以请尝试
xopt = fmin (chis, x0, maxiter=300)
答案 1 :(得分: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]