- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
将复合 PseudoVoigt 模型与参数命名前缀结合使用时,我收到 NameError。
我几乎复制了上一个问题中的复合模型示例,使用洛伦兹分布 ( Fitting a multi-peak function to a DataSet using LMFIT )。这对我来说效果很好,但洛伦兹线形状并不是我想要拟合的函数。
当我将 PseudoVoigtModel 用于单个峰值时,我没有任何问题。另外,洛伦兹模型与下面的代码配合得很好(我也将它包含在代码中,以便您可以自己仔细检查/确认)。
from lmfit.models import LorentzianModel, PseudoVoigtModel
import numpy as np
import matplotlib.pyplot as plt
def make_model_L(num):
pref = "f{0}_".format(num)
model = LorentzianModel(prefix = pref)
model.set_param_hint(pref+'amplitude', value=amplitude[num], min=0, max=5*amplitude[num])
model.set_param_hint(pref+'center', value=center[num], min=center[num]-0.5, max=center[num]+0.5)
model.set_param_hint(pref+'sigma', value=width[num], min=0, max=2)
return model
def make_model_V(num):
pref = "f{0}_".format(num)
model = PseudoVoigtModel(prefix = pref)
print('before',model.param_names)
model.set_param_hint(pref+'fraction',value = 0.7, vary = False)
model.set_param_hint(pref+'amplitude', value=amplitude[num], min=0, max=5*amplitude[num])
model.set_param_hint(pref+'center', value=center[num], min=center[num]-0.5, max=center[num]+0.5)
model.set_param_hint(pref+'fwhm', value=3, min=3/5, max=3*5)
model.set_param_hint(pref+'sigma', value=1, min=0, max=2)
model.set_param_hint(pref+'height', value=1, min=-np.inf, max=np.inf, expr='(((1-fraction)*amplitude)/(sigma*sqrt(pi/log(2)))+(fraction*amplitude)/(pi*sigma))')
print(model.param_names)
return model
# Some really coarse "data"
x = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]
y = [1,1,1,1,3,4,5,6,5,4,3,1,1,1,1,1,1,1,1,3,4,5,6,5,4,3,1,1,1,1]
peaks_in_interval = np.array([43, 159, 191, 296, 435, 544])
amplitude = [3,3]
width = [1,1]
center = [7,21]
mod = None
for i in range(len(center)):
#this_mod = make_model_L(i)
this_mod = make_model_V(i)
if mod is None:
mod = this_mod
else:
mod = mod + this_mod
out=mod.fit(y, x=x, method='leastsq')
plt.interactive(True)
print(out.fit_report())
plt.plot(x, y)
plt.plot(x, out.best_fit, label='best fit')
plt.plot(x, out.init_fit, 'r--', label='fit with initial values')
plt.show()
我收到的错误消息:
名称错误 <_ast.Module 对象位于 0x7f562524dbe0> ^^^名称“分数”未定义
NameError: at expr='<_ast.Module 对象位于 0x7f562524dbe0>'
我没有包含 TraceBack。它从“out=mod.fit(y, x=x, method='leastsq')”开始,以“~/anaconda3/lib/python3.6/site-packages/asteval/asteval.py in raise_exception(self ,节点,exc,msg,expr,lineno)”
如前所述,使用 LorentzianModel 一切正常,我得到了一个拟合(不是一个很好的拟合,但这是由于测试数据造成的)。
我不太精通 python,所以我无法真正给出有关问题可能是什么的明智提示。但是,我怀疑它与分数的命名以及它如何在 lmfit.fit() 函数中传递有关。
最好,一月
最佳答案
最好找到并发布一个显示问题的最小示例,并且最好包含完整的输出(包括回溯)。
例如,您会看到遇到的问题:
from lmfit.models import PseudoVoigtModel
pref = 'f1_'
model = PseudoVoigtModel(prefix = pref)
print('before',model.param_names)
model.set_param_hint(pref+'fraction',value = 0.7, vary = False)
model.set_param_hint(pref+'amplitude', value=2, min=0, max=5)
model.set_param_hint(pref+'center', value=0, min=-0.5, max=0.5)
model.set_param_hint(pref+'fwhm', value=3, min=3/5, max=3*5)
model.set_param_hint(pref+'sigma', value=1, min=0, max=2)
# suspect line:
model.set_param_hint(pref+'height', value=1, min=-np.inf, max=np.inf,
expr='(((1-fraction)*amplitude)/(sigma*sqrt(pi/log(2)))+(fraction*amplitude)/(pi*sigma))')
print(model.param_names)
params = model.make_params()
for p in params.values():
print(p)
问题的出现是因为没有名为fraction
的参数。正如上面几行所定义的,它被命名为 f1_fraction
。
要解决此问题,您应该更改 pref+'height'
的表达式,以便还包含 fraction
所需的 pref
前缀字符串、振幅
和西格玛
。
或者:您可以删除对 height
的提示,因为无论如何都会自动完成,并正确使用您提供的前缀。
另外:
a)绝对不鼓励像您一样使用参数提示来提供初始值。提示属于模型,不应依赖于任何特定的数据集。将模型作为一般事物创建,然后为每个数据集创建具有初始值的参数。
b) 不要将边界设置得太紧或基于初始值。界限(尤其是在参数提示中)应该用于防止参数变为非物理值,例如“sigma
为负数是没有意义的”,而不是因为定义模型的人认为“那应该足够接近了”。让合身发挥其作用。如果您确实需要设置自定义边界,请针对每个数据集进行设置。
关于python - 使用复合 PseudoVoigt 模型时出现 NameError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55533645/
虽然我试图完全理解 NoMethodError 和 NameError 之间的区别,但我发现 NameError 在祖先中不在 0 位置。是 DidYouMean 的魔法吗? [1] pry(main
请谁来帮我解决这个问题。**当在服务器上运行时,特定的结果会出现,但服务器运行得很好。当我运行代码时,它发送这个错误
下面的 Python 由于某种原因失败了。 class NetVend: def blankCallback(data): pass def sendCommand(c
作为this great answer建议,从 Python 3.7 开始,如果 from __future__ import annotations 使用指令。 但是,如果我想为注释类型创建别名,这
我在导入自制模块时遇到了一些麻烦,我只是看不出我做错了什么。 我有一个名为 basics 的包,其中包含我所有的基类 我有一个名为 components 的第二个包,components 中的每个模块
我的 python 代码不断出现名称错误,未在 ticketSold 上定义全局变量。我不确定如何解决这个问题,因为我确实将其定义为全局变量。感谢您的帮助。 aLimit=300 bLimit=500
我正在安装 Redmine,但由于抽成问题,我快疯了。特别是,为了对不同的 Ruby 插件执行捆绑安装,我被要求安装 xapian-full-alaveteli,v 1.2.9.5。问题是我收到以下错
我的 python 代码不断出现名称错误,未在 ticketSold 上定义全局变量。我不确定如何解决这个问题,因为我确实将其定义为全局变量。感谢您的帮助。 aLimit=300 bLimit=500
我正在安装 Redmine,但由于抽成问题,我快疯了。特别是,为了对不同的 Ruby 插件执行捆绑安装,我被要求安装 xapian-full-alaveteli,v 1.2.9.5。问题是我收到以下错
所以我是第一年,有一点编码经验,但不多,我被赋予了制作基于文本的冒险游戏的任务。我的讲师给了我们一个模板并帮助我们开始,但我很困惑为什么这段代码会导致 shell 显示 NameError: name
我有一些编程经验,但我对 python 很陌生,我正在尝试弄清楚如何使用和导入 .py 文件中的类而不是 main 。我目前正在使用 netbeans,运行 CPython 3.2.1。 根据我现在的
代码非常简单,我刚刚开始用 python 编程 代码 man = input ("what's your name mister") print("his name is "+man) 运行程序后收到
我在文件中创建一个类。声明一些类变量 A = 5 和另一个类变量 B = A+1。从另一个文件导入该类时,出现 NameError: name 'A' is not Defined。有没有办法解决这个
我一直在为 Minecraft 的 Raspberry Pi 版本制作 mod,每次在程序中输入其中一个命令时,我都会遇到非常令人沮丧的错误。这是我的代码: import minecraft.mine
为什么会这样: def fn(proc, *args, **kwargs): cache = proc.cache = {} def cached_execution(cache, *
我是 Python 的新手,正在学习类,正在尝试编写一个“个人信息”程序: 这是我的代码: class PersonalInfo(): def names(self, name):
我今天用这个简单的代码遇到了一个非常奇怪的问题: var1 = 1 var2 = 2 if var1 > var2 > var3: print('Does not run') print('D
我正在 try catch 无法加载模块时发生的任何异常。当前的结果是“except” block 没有被执行。 import sys def loadModule(module): try:
这是我的代码: import os if os.path.exists(r'C:\Genisis_AI'): print("Main File path exists! Continuing
我正在学习列表理解,通过切换变量我得到了 2 个不同的结果,尽管它们看起来应该工作相同。 数组 a 等于 [[0, 0, 0, 0, 0], [1, 0, 0, 0, 0], [0, 0, 0, 0
我是一名优秀的程序员,十分优秀!