洛伦兹模块

Lorentzian module

所以我在我的代码中使用了这种洛伦兹拟合,但我的代码有些地方不对。

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

总是更好 到 post 实际代码 运行 显示问题 到显示完整结果,包括任何错误消息。真的,永远更好,永远不会更糟。说出你做了什么(即 post 完整代码)和发生了什么(即 post 完整输出)。令人担忧的是,有多少人没有这样做,并错误地认为人们会希望帮助他们解决一个可悲的不完整问题 ("I did something, but it didn't work. Help pleeze!")。好消息是,现在你,是的,你,汤米,知道了这一点,再也不必成为那样的人了。

除了不完整之外,您的代码还有一些不同的问题。我鼓励您查看文档中的示例,例如 https://lmfit.github.io/lmfit-py/builtin_models.html#example-1-fit-peak-data-to-gaussian-lorentzian-and-voigt-profiles and the many examples at 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

顺便说一句,你的 commented-out 行

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()!

如果您不想从 "guessed" 参数值开始,您还可以创建一个参数对象,为所有可变参数提供初始值,例如

model = LorentzianModel()
params = model.make_params(amplitude=6, center=5, sigma=1)

希望对您有所帮助。