2016-08-07 3 views
-2

저는 화학 연구를 위해이 스크립트를 실행하려고합니다.
http://pubs.acs.org/doi/suppl/10.1021/acs.analchem.5b02258__init__에 예상치 못한 키워드가 있습니다.

이 명령은 도움이 될 수 있습니다 :

"fsolve_withPT.py는 두 가지 명령 줄 인수를 내가 제대로 여기에 스크립트를 복사하지 않은 경우

는 파일을 다운로드 할 수있는 링크입니다 "MamPol2_titration_data.txt"및 "Kaps_result.txt"의 출력 파일명 "

ㅁ 입력 파일명 나는이 오류 메시지가 ipython에서 스크립트 실행 도중 :
__init__() got an unexpected keyword argument 'step_max'

#University of California San Francisco 
#Supplemental for 
# 
#A model for specific and nonspecific binding of ligand to multi-protein 
#complexes by native mass spectrometry 
# 
#Shenheng Guan, et al 
#2015 
# 

import sys 
import math 
import numpy 
import warnings 
from scipy.optimize import fsolve,fmin 
import matplotlib.pyplot as plt 
warnings.filterwarnings('ignore') 

input_fn='MamPol2_titration_data.txt' 
output_fn='Kaps_result1.txt' 
##input_fn=sys.argv[1] 
##output_fn=sys.argv[1] 

fid=open(input_fn,'r') 
line=fid.readline() 
line=line.strip('\n') 
no_mam=[float(x) for x in line.split('\t')[1:]] 
line=fid.readline() 
data=[] 
conc=[] 
for line in fid: 
line=line.strip('\n') 
tmp0=line.split('\t') 
conc.append(float(tmp0[0])) 
tmp1=[float(x) for x in tmp0[1:]] 
data.append(tmp1) 
fid.close() 

class fsolve_withPT: 
    def __init__(self,conc,data): 
     self.conc = conc 
     self.data = data 

    def ff(self, x, Kas, LT, PT):#x[0]:[P];x[1]:[PL]...;x[n]:[PLn];x[-1]:[L] n+2 (10) 
     fc=[] 
     for j in range(0,len(x)-2):#setup equilibrium equations 
      fc.append(Kas[j]*x[j]*x[-1]-x[j+1]) 

     #mass conservation for P 
     tmpP=0.0#[P] 
     for j in range(0,len(x)-1):#x[0] to x[8] or [P] to [PL8] 
      tmpP=tmpP+x[j] 
     fc.append(tmpP-PT)#PT equals to all P species combined 

     #mass conservation for L 
     tmpL=x[-1]#[L] 
     for j in range(1,len(x)-1): 
      tmpL=tmpL+j*x[j] 
     fc.append(tmpL-LT) 

     return fc 

    def error(self,w): 
     Kas=w[:-1] 
     PT=w[-1] 
     mySum=0.0 
     for m in range(0,len(self.conc)):#over conc (LT) 
      #print Kas,self.conc[m],PT 
      F=fsolve(self.ff, [1.0]*10, args=(Kas, self.conc[m], PT)) 
      myPT=sum(F[:-1]) 
      for k in range(0, len(no_mam)):#over # of Mam 
       mySum=mySum+(F[k]/myPT-self.data[m][k])**2 
     return mySum 

w0=[8,7,6,5,4,3,2,1,0] 
w0=numpy.array(w0) 
w0=w0*3.01e4 
w0[-1]=5.e-6 

myFclass=fsolve_withPT(conc,data) 

w, fopt, iter, funcalls, warnflag = fmin(myFclass.error, w0, maxiter=2000, 
             maxfun=2000, full_output=True,disp=True) 

# http://nullege.com/codes/show/[email protected]@[email protected]@[email protected][email protected]_benchmarks.py/73/numdifftools.Hessian 
import numdifftools as nd 
#my_step_nom=[1.0e3]*8+[1.0e-6]*1 
my_step_nom=w#*1.0e-3 
hessian = nd.Hessian(myFclass.error,step_max=1.0e-2,step_nom=my_step_nom)#, step_max=1.0, step_nom=numpy.abs(w)) 
H = hessian(w) 
covH=numpy.linalg.inv(H) 

conc0=conc#numpy.linspace(0.0,6.0E-05,num=101).tolist() 
y0=[] 
for tmp in conc0: 
F=fsolve(myFclass.ff, [1.0]*10, args=(w[:-1], tmp,w[-1])) 
y0.append(F) 
#y0=myFunc(conc0,w) 

fid=open(output_fn,'w') 
fid.write('Calculated complex conc. (M)\t'+str(w[-1])+'\n') 
fid.write('# of Mam in Complex\t') 
for j in no_mam: 
    fid.write(str(j)+'\t') 
    fid.write('\n') 
    fid.write('Associate constants (Kas)\t\t') 
for j in no_mam[:-1]: 
    fid.write(str(w[j])+'\t') 
    fid.write('\n') 
    fid.write('Mam Conc. (M)\tSimulated abundances\n') 
for k in range(0,len(y0)): 
    fid.write(str(conc0[k])+'\t') 
    yc=y0[k] 
tmp=sum(yc[:-1]) 
for j in range(0,len(yc)-2): 
    fid.write(str(yc[j]/tmp)+'\t') 
fid.write(str(yc[-2])+'\n') 
fid.close() 

from scipy import stats 
SS=fopt 
DF=len(data)*len(data[0])-len(w) 
t_factor=stats.t.ppf(0.95, DF) 

SE=[] 
dw=[] 

for j in range(0,len(w)): 
    SE.append(numpy.sqrt(SS/DF*numpy.abs(covH[j,j]))) 
for j in range(0,len(w)): 
    dw.append(SE[j]*t_factor) 
+0

어떤 줄이 오류를 나타 냅니까? – parsecer

답변

3

를 사용하면 용지의 코드가 잘못 becuase이 코드를 실행 할 수 없습니다. 나는 올바른 코드가 있는지 확인하기 위해 게시 한 링크의 코드도 다운로드했습니다. 나는 또한 당신의 오류를 재현 할 수있었습니다. 나는 무슨 일이 일어나고 있는지 그리고 당신이 이것에 비추어 무엇을 할 수 있는지 설명하려고 노력할 것입니다.

오류 init() got an unexpected keyword argument 'step_max'은 기본적으로 코드가 일부 초기 매개 변수를 사용하여 개체를 만들도록 python에 알려주고 있지만 python은 'step_max'필드를 인식하지 못한다는 것을 의미합니다. myFclass.error, step_max = 1.0E-2 :

코드의 범인 라인은

hessian = nd.Hessian(myFclass.error,step_max=1.0e-2,step_nom=my_step_nom) 

당신은 그 세 가지 초기 매개 변수 주어진 nd.Hessian 개체를 만드는 파이썬을 말하려고입니다 볼 수 있습니다 , 그리고 step_nom = my_step_nom. 문제는 nd.Hessian 초기화 프로그램이 step_max 및 step_nom이라는 매개 변수를 사용하지 않는다는 것입니다.

그렇다면 nd.Hessian 초기화 프로그램은 무엇을 차지합니까? nd.Hessian은 numdifftools 패키지의 Hessian 객체이므로 소스 코드를 살펴 보았습니다. 아니나 다를까, 이것은 nd.Hessian 객체를 초기화하는 소스 코드는 다음과 같습니다

class Hessian(_Derivative): 
    def __init__(self, f, step=None, method='central', full_output=False): 

__init__를 살펴 보자. f, step, methodfull_output이 걸리는 것을 확인할 수 있습니다. step_maxstep_nom을 가져온 경우 해당 입력란은 __init__에 포함되었을 것입니다.

하나의 옵션은 np.Hessian 개체를 올바르게 사용하고 step 매개 변수를 사용하여 사용하려는 단계를 파악하는 것입니다.

예를 들어, 당신은 코드를 실행할 수 있습니다

hessian = nd.Hessian(myFclass.error,step=1.0e-2) 

으로

hessian = nd.Hessian(myFclass.error,step_max=1.0e-2,step_nom=my_step_nom) 

를 교체합니다. 종이와 같은 결과를 내지 못할 수도 있지만 결과를 얻기 위해 어떤 코드를 실행했는지 결코 알 수 없습니다.

이 코드를 계속 사용하고 numdifftools 패키지를 사용하려는 경우 좋은 설명과 설명 및 예가있는 source code을 살펴 보시기 바랍니다.

+1

정말 감사합니다! 문제를 분명하게 밝히지 않은 커뮤니티에 사과 - 저는 파이썬에서 완전히 초보자입니다! – user6688825

관련 문제