所以我使用这个洛伦兹符合我的代码,但是我的代码不对。
x = freqs2
y = psd2
model = LorentzianModel()
model.guess(y, x=x)
#model.param_names['amplitude'].value = int(6)
init_fit = model.model(x=x)
model.fit(y, x=x)
final_fit = model.model(x=x)
plt.plot(x, final_fit, 'r-')
plt.plot(x, init_fit, 'k--')
plt.plot(x, y, 'bo')
我得到的错误是没有名为" model"的属性,你知道该怎么做吗?我正在使用文档。当我用模型评论这些线时,我得到了这个:
这几乎是我需要的,但是这个属性错误怎么办?
顺便说一句。
#model.param_names['amplitude'].value = int(6)
这条线也不起作用,所以我评论了它。
编辑:
x = freqs2
y = psd2
mod = LorentzianModel()
pars = mod.guess(y, x=x)
out = mod.fit(y, pars, x=x)
print(out.fit_report(min_correl=0.25))
我已经检查了我的代码,它似乎给出了很好的结果,但我不知道如何绘制它。我从这边使用这个:
https://lmfit-py.readthedocs.io/en/latest/builtin_models.html#example-1-fit-peaked-data-to-gaussian-lorentzian-and-voigt-profiles
答案 0 :(得分:2)
总是更好发布运行的实际代码以显示问题和以显示完整结果,包括任何错误消息。真的,总是更好,永远不会更糟。说出你做了什么(即发布完整代码)和发生了什么(即发布完整输出)。令人震惊的是,有多少人没有这样做,并错误地认为人们会想要用一个可悲的不完整的问题来帮助他们(“我做了一些事情,但它没有用。帮助打瞌睡!”)。好消息是,现在你,是的,你,汤米,知道这一点,永远不必再成为那样的人了。
除了不完整之外,您的代码还有一些不同的问题。我建议您查看文档中的示例,例如https://lmfit.github.io/lmfit-py/builtin_models.html#example-1-fit-peak-data-to-gaussian-lorentzian-and-voigt-profiles和https://github.com/lmfit/lmfit-py/tree/master/examples处的许多示例
看起来你对python来说还是个新手。否则,您将运行上面的代码(假设导入已正确发生并且数据已定义)并且已经看到了
Traceback (most recent call last):
File "myfit.py", line XXX, in <module>
init_fit = model.model(x=x)
AttributeError: 'LorentzianModel' object has no attribute 'model'
并意识到model
没有名为model
的属性。
您可能正在寻找评估模型的方法。你没有明确地问过这个问题(提示:下次问一个你想要回答的问题!),但如果你这样做了,你可能已经阅读了文档以找到方法eval()
(http://lmfit.github.io/lmfit-py/model.html#lmfit.model.Model.eval)。这需要一个params
对象,保存参数。您可以从model.guess()
获得此信息,但是您没有保留model.guess()
返回的值,因此您没有将其传递给model.eval()
。做类似的事情:
model = LorentzianModel()
params = model.guess(y, x=x)
init_fit = model.eval(params, x=x)
会有效,然后你可以(例如)绘制数据和初始拟合。您可以继续实际拟合,但是您需要再次包含参数,至少执行
model.fit(y, params, x=x) # don't do this!
适合发生。当然,你几乎肯定想知道那个拟合的结果是什么,所以,你需要保存结果,这需要
result = model.fit(y, params, x=x) # yes, do this!
为了在合身后看到最合适的颜色,你不会这样做
final_fit = model.eval(params, x=x) # no, that is still the initial fit!!
而是做
final_fit = model.eval(result.params, x=x) # yes, this uses the resulting parameters
甚至更好
final_fit = result.best_fit # the best fit is already included in the result
顺便说一下,您的注释掉的行
model.param_names['amplitude'].value = int(6)
无效,因为model.param_names
是一个列表,而不是一个字典。但这不是你想要的。假设您打算将amplitude
参数的初始值设置为6
,则可以
model = LorentzianModel()
params = model.guess(y, x=x)
params['amplitude'].value = 6 # no need for int()!
如果您不想以“猜测”参数值开头,您还可以创建一个参数对象,为所有变量参数提供初始值,例如
model = LorentzianModel()
params = model.make_params(amplitude=6, center=5, sigma=1)
希望有所帮助。