2017-12-12 13 views
0

나는 MCMC를 사용하여 데이터에 ODE 방정식의 모델을 피팅 있지만 오류 과거 얻을 수없는 임무를 해요 :형식 오류 : 물류()없는 한 필요한 위치 인수 '의 PARAMS'

TypeError         Traceback (most recent call last) 
<ipython-input-21-10d0a714b5f4> in <module>() 
    26   proposed[j] = proposed[j] + np.random.normal(0,propsigma[j]) 
    27   if (proposed[j]>0): # automatically reject moves if proposed parameter <=0 
---> 28    alpha = np.exp(logistic_loglik (proposed,time,ExRatio,sig)-logistic_loglik(par_out[i-1,],time,ExRatio,sig)) 
29    u = np.random.rand() 
30    if (u < alpha): 

<ipython-input-21-10d0a714b5f4> in logistic_loglik(params, t, data, sig) 
    3 # set up a function to return the log likelihood 
    4 def logistic_loglik(params,t,data,sig): 
--> 5  return sum(norm.logpdf(logistic(params,t),data,sig)) 
    6 
    7 # set standard deviations to be 10% of the population values 

TypeError: logistic() missing 1 required positional argument: 'params' 

문제 이 라인이다 :이 라인의 기능은 로그 가능성을 반환하는 함수를 설정

def logistic_loglik(params,t,data,sig): 
    return sum(norm.logpdf(logistic(params,t),data,sig)) 

분명히 관련된 물류 모델이있다.

이 문제는 'params'가 함수에 의해 호출되지 않는다는 것을 이해하지만이 코드를 상대적 초보자가되는 문제를 해결하는 방법을 확신 할 수 없습니다.

나머지는 컨텍스트를 추가하는 코드입니다.

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.integrate import odeint 

%matplotlib inline 

def logistic(x,t,params):  
    S, R, A = x 
    r, Nmax, delta_s, beta, gamma, delta_r, delta_a, Emax, H, MICs, MICr = params 
N = S + R 
E_s = 1 - (Emax * A**H)/(MICs**H + A**H) 
E_r = 1- (Emax * A**H)/(MICr**H + A**H) 

derivs = [r * (1 - N/Nmax) * E_s * S - delta_s * S - ((beta * S * R)/N), 
     r * (1 - gamma) * (1 - N/Nmax) * E_r * R - delta_r * R + ((beta * S * R)/N), - delta_a * A] 


return derivs 

r = 0.5 
Nmax = 10**7 
delta_s = 0.025 
beta = 10**-2 
gamma = 0.5 
delta_r = 0.025 
delta_a = 0.003 
Emax = 2 
H = 2 
MICs = 8 
MICr = 2000 

[r, Nmax, delta_s, beta, gamma, delta_r, delta_a, Emax, H, MICs, MICr] = params 
S = 9 * 10**6 
R = 10**5 
A = 5.6 
x0 = [S, R, A] 

maxt = 2000 
tstep = 1 
t = np.arange(0,maxt,tstep) 

def logistic_resid(params,t,data): 
    return logistic(params,t)-data 

logistic_out = odeint(logistic, x0, t, args=(params,)) 

time = np.array([0, 168, 336, 504, 672, 840, 1008, 1176, 1344, 1512, 1680, 1848, 2016, 2184, 2352, 2520, 2688, 2856]) 
ExRatio = np.array([2, 27, 43, 36, 39, 32, 27, 22, 13, 10, 14, 14, 4, 4, 7, 3, 3, 1]) 
ratio = 100* logistic_out[:,1]/(logistic_out[:,0]+logistic_out[:,1]) 
plt.plot(t,ratio) 
plt.plot(time,ExRatio,'h') 
xlabel('Position') 
ylabel('Pollution') 

새로운 세포

from scipy.stats import norm 

# set up a function to return the log likelihood 
def logistic_loglik(params,t,data,sig): 
    return sum(norm.logpdf(logistic(params,t),data,sig)) 

# set standard deviations to be 10% of the population values 
sig = ExRatio/10 

# parameters for the MCMC 
reps = 50000 
nparams = 3 

# output matrix 
par_out = np.ones(shape=(reps,nparams)) 
# acceptance 
accept = np.zeros(shape=(reps,nparams)) 
# proposal standard deviations. These have been pre-optimized. 
propsigma = [0.05,20,5] 

for i in range(1,reps): 
    # make a copy of previous parameters 
    par_out[i,] = par_out[i-1,] 
    for j in range(npars): 
     proposed = np.copy(par_out[i,:]) # we need to make a copy so that rejected moves don't affect the original matrix 
    proposed[j] = proposed[j] + np.random.normal(0,propsigma[j]) 
    if (proposed[j]>0): # automatically reject moves if proposed parameter <=0 
     alpha = np.exp(logistic_loglik(proposed,time,ExRatio,sig)-logistic_loglik(par_out[i-1,],time,ExRatio,sig)) 
     u = np.random.rand() 
     if (u < alpha): 
      par_out[i,j] = proposed[j] 
      accept[i,j] = 1 

#print(sum(accept[range(101,reps),:])/(reps-100)) 


#plt.plot(par_out[:,0]) 
#plt.plot(par_out[range(101,reps),0]) 
#plt.plot(par_out[:,0],par_out[:,2]) 
plt.hist(par_out[range(101,reps),0],50) 
print('\n') 
a=np.mean(par_out[range(101,reps),0]) 

내가 밖으로 대답 알려 주시기 바랍니다에게 필요한 모든 정보를 떠난 그래서 만약 여기에이 내 첫 번째 질문입니다.

은 어떤 도움이 크게

답변

0

귀하의 기능은 다음과 같습니다 apprecieated 될 것이다 :

def logistic(x,t,params) 

그것은 인수를합니다. 하지만 당신이 만 호출에

def logistic_loglik(params,t,data,sig): 
    return sum(norm.logpdf(logistic(params,t),data,sig)) 

변경을 :

def logistic_loglik(params,t,data,sig): 
    return sum(norm.logpdf(logistic(data, t, params), sig)) 
+0

이 오류가 감사를 해결되었다 제안 된 변경을 구현 가졌어요. 나는 지난 며칠 동안 다음 오류를 풀려고 노력했다. 'ValueError : 포장을 풀기에 너무 많은 값 (예상 3)'은 'alpha = np.exp (logistic_loglik (제안, 시간, ExRatio, sig) -logistic_loglik def logistic_loglik (params, t, data, sig) : ----> 5 반환 합계 (norm.logpdf (logistic (ratio, t, params), sig)) and 'S, R, A = x'그러나이 문제를 해결할 수 없었으므로 진행 방법에 대한 조언을 드릴 수 있기를 바랍니다. –

+0

오류가 단지 값만 기대하고 있다고 느낍니다. S, R 및 A에 대한 것이지만 이것이 'x'의 구조로 인해 발생할 수 있다고 생각하는 것이 더 많지만이를 개선하는 방법이 확실하지 않거나 '비율'이이 라인의 어딘가에 필요할 수도 있습니다. 운동 어디 –

+0

그게 도움이 위대한. BTW, 귀하의 문제를 해결하는 경우 답변을 [수락] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) 할 수 있습니다. 새로운 문제가 생기면 새로운 질문을 할 수 있습니다. –