2016-08-07 7 views
-2

私は化学研究のためにこのスクリプトを実行しようとしています。
http://pubs.acs.org/doi/suppl/10.1021/acs.analchem.5b02258__init__は予期せぬキーワードの引数を持っています

この命令は役に立つかもしれ:

「fsolve_withPT.pyは、2つのコマンドライン引数を取り、私は正しくここにスクリプトをコピーしなかった場合には

は、ファイルをダウンロードするためのリンクです:「MamPol2_titration_data.txt」と「Kaps_result.txt」の 出力ファイル名」

Whをの入力ファイル名紙のコードが間違っているbecuaseあなたはこのコードを実行することはできません
__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

:私はipython上でスクリプトを実行する途中、私は、このエラーメッセージが表示されます。私はあなたが正しいコードを持っていることを確認するために投稿したリンクからコードをダウンロードしました。私はあなたのエラーを再現することもできました。私は何が起こっているのか、これに照らしてあなたができることを説明しようとします。

エラーinit() got an unexpected keyword argument 'step_max'は、基本的にコードがいくつかの初期パラメータを持つオブジェクトを作成するようpythonに指示しているが、pythonは 'step_max'フィールドを認識しないことを意味します。

コードで犯人ラインは、あなたがそれは3つの初期パラメータが与えられたnd.Hessianオブジェクトを作成するためのpythonを伝えようとしているされて見ることができます

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

です:myFclass.error、step_max = 1.0E-2 、およびstep_nom = my_step_nom。ここでの問題は、nd.Hessian初期化子がstep_maxとstep_nomというパラメータを取らないことです。

それでは、nd.Hessian初期化子は何をしますか? nd.Hessianはnumdifftoolsパッケージのヘッセ行列オブジェクトなので、ソースコードを見てみました。案の定、これはnd.Hessianオブジェクトを初期化するためのソースコードです:

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

__init__を見てみましょう。 fstepmethodfull_outputが表示されます。 step_maxstep_nomを入力した場合、これらのフィールドは__init__に含まれていました。

1つのオプションは、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

ありがとうございました。 問題をはっきりと述べていないコミュニティにお詫び申し上げます - 私は本当にPythonの初心者です! – user6688825

関連する問題