洛伦兹模块
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)
希望对您有所帮助。
所以我在我的代码中使用了这种洛伦兹拟合,但我的代码有些地方不对。
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)
希望对您有所帮助。