Python __init_u;得到一个意外的关键字参数

Python __init_u;得到一个意外的关键字参数,python,Python,我正在试着为化学研究编写这个脚本 如果我没有正确复制脚本,这里有下载文件的链接: 本说明可能有帮助: “fsolve_withPT.py接受两个命令行参数:输入文件名“MamPol2_tituting_data.txt”和 “Kaps_result.txt”的输出文件名 在ipython上运行脚本时,我收到以下错误消息: \uuuu init\uuuuuuuuuuuuuuuuuuuu()得到一个意外的关键字参数“step\u max” #University of California San

我正在试着为化学研究编写这个脚本

如果我没有正确复制脚本,这里有下载文件的链接:

本说明可能有帮助:

“fsolve_withPT.py接受两个命令行参数:输入文件名“MamPol2_tituting_data.txt”和 “Kaps_result.txt”的输出文件名

在ipython上运行脚本时,我收到以下错误消息:
\uuuu init\uuuuuuuuuuuuuuuuuuuu()得到一个意外的关键字参数“step\u 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/src@n@u@Numdifftools-0.6.0@numdifftools@speed_comparison@run_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)

您无法运行此代码,因为纸张的代码不正确。我甚至从你发布的链接下载了代码,以确保我有正确的代码。我也能重现你的错误。我将尝试解释正在发生的事情,以及根据这一点,您可以做些什么

错误
init()得到了一个意外的关键字参数“step\u max”
本质上意味着代码告诉python使用一些初始参数创建一个对象,但python无法识别“step\u max”字段

代码中的罪犯行是

hessian = nd.Hessian(myFclass.error,step_max=1.0e-2,step_nom=my_step_nom)
您可以看到,在给定三个初始参数的情况下,它试图告诉python创建一个nd.Hessian对象:myFclass.error、step_max=1.0e-2和step_nom=my_step_nom。这里的问题是nd.Hessian初始值设定项不接受称为step_max和step_nom的参数

那么,nd.Hessian初始值设定项取什么呢?Hessian是numdifftools包中的Hessian对象,因此我查看了源代码。果然,这是初始化nd.Hessian对象的源代码:

class Hessian(_Derivative):
    def __init__(self, f, step=None, method='central', full_output=False):
请看一下
\uuuu init\uuuu
。您可以看到它需要
f
步骤
方法
,以及
完整输出
。如果它已在
步骤max
步骤nom
中执行,则这些字段将包含在
\uuuuuuu init\uuuu

一种选择是尝试正确使用np.Hessian对象,并使用step参数,找出您想要使用的步骤

例如,如果替换

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

您将能够运行代码。它可能不会给出与论文相同的结果,但是,您永远不会真正知道他们运行了什么确切的代码来获得结果


如果您想继续使用这段代码并想使用numdifftools包,我建议您看看有很好的解释、注释和示例的。

哪行给出了错误?非常感谢!对于没有清楚地说明这个问题,我向社区表示歉意——我真的是Python的新手!
hessian = nd.Hessian(myFclass.error,step=1.0e-2)