洛伦兹模块

时间:2018-03-19 19:21:50

标签: python python-2.7 curve-fitting

所以我使用这个洛伦兹符合我的代码,但是我的代码不对。

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"的属性,你知道该怎么做吗?我正在使用文档。当我用模型评论这些线时,我得到了这个:

enter image description here

这几乎是我需要的,但是这个属性错误怎么办?

顺便说一句。

#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

1 个答案:

答案 0 :(得分:2)

总是更好发布运行的实际代码以显示问题以显示完整结果,包括任何错误消息。真的,总是更好,永远不会更糟。说出你做了什么(即发布完整代码)和发生了什么(即发布完整输出)。令人震惊的是,有多少人没有这样做,并错误地认为人们会想要用一个可悲的不完整的问题来帮助他们(“我做了一些事情,但它没有用。帮助打瞌睡!”)。好消息是,现在你,是的,你,汤米,知道这一点,永远不必再成为那样的人了。

除了不完整之外,您的代码还有一些不同的问题。我建议您查看文档中的示例,例如https://lmfit.github.io/lmfit-py/builtin_models.html#example-1-fit-peak-data-to-gaussian-lorentzian-and-voigt-profileshttps://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)
希望有所帮助。