我正在尝试使用文档网站中的lmfit来完成一个示例:
import sys
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from matplotlib.backends.backend_pdf import PdfPages
from lmfit import minimize, Parameters, Parameter, report_fit, Minimizer, conf_interval, conf_interval2d, printfuncs
from lmfit import Model
def main():
def decay(t, N, tau):
return N*np.exp(-t/tau)
decay_model = Model(decay)
print decay_model.independent_vars
for pname, par in decay_model.params.items():
print pname, par
if ___name___ == "___main___":
main()当我执行最后一个命令时,会得到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Model' object has no attribute 'params'似乎params不是模型的一个属性。有人能解释一下为什么这段代码不起作用吗?我在多台计算机和Python版本上尝试了这种方法。运行于Python2.7.9 32位,Windows 7。
发布于 2016-01-19 21:36:59
可能导致问题的因素是--假设这是您的全部代码--您不使用任何数据进行匹配,也不会在任何地方初始化参数字典。下面是一个很小的示例,对于0.8.3版(请参见下面的输出)很好;如果您使用0.9.x,您将不得不一点点地调整一个部分(检查这里,它已经从0.8.3更改到0.9.x)。
import numpy as np
import matplotlib.pyplot as plt
from lmfit import minimize, Parameters, Parameter, report_fit
# generate some data with noise
# replace xData and yData with your data
xData = np.linspace(0., 100., 50.)
Nf = 5.
tauf = 6.5
yData = Nf * np.exp(-xData / tauf) + np.random.normal(0, 0.5, len(xData))
# plt.plot(xData, yData, 'bo')
# plt.show()
def decay(params, x, data):
N = params['N'].value
tau = params['tau'].value
model = N * np.exp(-x/tau)
return model - data # that's what you want to minimize
# create a set of Parameters
params = Parameters()
params.add('N', value=10) # value is the initial value
params.add('tau', value=8.)
# do fit, here with leastsq model
result = minimize(decay, params, args=(xData, yData))
# calculate final result
final = yData + result.residual
# write error report
report_fit(params)
# plot the data
plt.plot(xData, yData, 'bo')
plt.plot(xData, final, 'r')
plt.show()首先,我使用您的衰减函数创建一些数据,并给它添加一些噪声;这一部分应该被您的数据替换。剩下的部分很简单,您可以得到以下输出(由于数据中添加了噪声,确切的值可能有所不同):
[[Variables]]
N: 5.15685000 +/- 0.419115 (8.13%) (init= 10)
tau: 6.58557758 +/- 0.877337 (13.32%) (init= 8)如您所见,所确定的参数与我为数据生成所选择的参数非常接近。绘制数据和拟合结果如下:

lmfit的好处是您可以为参数值使用边界。您可以检查示例这里。
希望这能让你开始,如果你还有其他问题,请告诉我。
https://stackoverflow.com/questions/34870104
复制相似问题