如何在zfit中创建固定参数并修改其浮动状态?
嘿,刚好之前在zfit里处理过类似的参数固定需求,这俩问题都有很直接的解决办法,我给你一步步讲清楚:
1. 创建参数时直接固定
在zfit里创建Parameter对象的时候,只需要在初始化时加上floating=False参数,就能直接把这个参数设为固定状态,不会在拟合过程中被优化。举个例子:
import zfit # 创建一个固定值为5的参数,不会参与拟合优化 fixed_param = zfit.Parameter("fixed_param", value=5, floating=False)
这样这个参数的值就会一直保持初始设定的5,拟合器完全不会碰它。
2. 多组拟合中修改参数浮动状态
你提到的“定义非浮动参数”和“修改状态”其实可以通过set_floating()方法灵活控制,而且参数的浮动状态和边界设置是完全独立的——你说的“创建无边界参数无法使其固定”应该是个误解,无边界只是参数的取值范围限制,和它是否参与拟合优化没有关系。
具体操作:
定义非浮动参数:有两种方式
- 像上面说的,创建时直接加
floating=False - 先创建普通浮动参数,之后调用
param.set_floating(False)把它改成固定状态
- 像上面说的,创建时直接加
修改参数浮动状态:不管参数有没有设置边界,随时可以用
set_floating(True/False)切换它的状态,完美适配多组拟合的场景。比如下面这个多阶段拟合的例子:
import zfit # 先创建几个初始为浮动状态的参数(其中mu是无边界参数) mu = zfit.Parameter("mu", value=1) # 无边界参数 sigma = zfit.Parameter("sigma", value=0.5, lower=0.1, upper=2) bg = zfit.Parameter("bg", value=10, lower=1, upper=100) # 第一组拟合:固定mu和sigma,只优化bg mu.set_floating(False) sigma.set_floating(False) # 这里执行第一组拟合的逻辑(创建模型、损失函数、运行 minimizer) # ... # 第二组拟合:放开mu,继续固定sigma,优化mu和bg mu.set_floating(True) sigma.set_floating(False) # 这里执行第二组拟合的逻辑 # ... # 第三组拟合:所有参数都放开优化 mu.set_floating(True) sigma.set_floating(True) bg.set_floating(True) # 执行第三组拟合 # ...
哪怕是无边界的mu,只要调用set_floating(False)就能把它固定住,完全不受边界设置的影响。
内容的提问来源于stack exchange,提问作者jonas-eschle
相关产品推荐
相关产品推荐

