python - 在 symfit python 模块中使用命名模型来拟合高斯分布
问题描述
我正在尝试编写一个代码,用于使用 symfit 模块同时拟合两个具有两个不同方程和一些共享参数的数据集。在这里显示太复杂了,所以我用相同的命令显示另一个代码并且更简单。在这里,我尝试用线性函数拟合一系列数据,但斜率呈高斯分布。这是代码:
`
import symfit as sf
from symfit import parameters, variables, Fit, Model, Ge, CallableModel
from symfit.core.minimizers import BFGS, BasinHopping, NelderMead, DifferentialEvolution
xd= [1.1, 3, 5, 7, 9, 11, 14, 19, 25, 32, 44]
yd= [5.5, 8, 11, 14, 18, 22, 28, 35,45, 69, 110]
pi=3.14
x, y = variables('x, y')
a = sf.Parameter('a',value=3)
b = sf.Parameter('b',value=0.7)
sigma= sf.Parameter('sigma',value=0.7)
res=0
norm=0
for i in range(1,5):
atemp= (a + ((i-1)*3*sigma/2))
gauss= sf.exp(-(atemp-a)**2/(2*(sigma**2)))/sf.sqrt(2*pi*(sigma**2))
res= res+ gauss* (atemp * x + b)
norm= norm + gauss
if i == 4:
firstres= res
firstnorm= norm
res=0
norm=0
funfit = Model({y: (firstres/firstnorm)})
fit = Fit(funfit, x= xd, y=yd, minimizer=[NelderMead, BFGS])
fit_result = fit.execute()
print(" Best-Fit Parameters: ", fit_result)
`
这就是我得到这个错误的原因“NameError: name 'DiracDelta' is not defined”
解决方案
您可以尝试替换Model
为GradientModel
甚至CallableModel
. 出现问题是因为默认情况下会计算模型的 Hessian 矩阵,而对于高斯矩阵,这会产生DiracDelta
未简化的 a。使用这些其他模型中的任何一个都不会导致计算 Hessian,因此应该可以解决问题。所以,
from symfit import CallableModel
funfit = CallableModel({y: (firstres/firstnorm)})
另外,你用的是哪个版本?这symfit >= 0.5.2
不应该再发生了,所以我很想知道:)。
推荐阅读
- python - 检查值是否在 DataFrame 系列中(“系列的真值不明确”错误)
- typescript - 条件类型没有适当的限制
- katalon-studio - 如何在 Katalon 中上传文件
- java - OpenCV选择灰色范围
- ffmpeg - 通过字节范围分段时,HLS 编码的视频 (ffmpeg) 在 Safari 中中断
- android - 使缓存无效/重新启动后,Gradle 项目同步失败错误?
- python - 使用pandas groupby的结果从列的pandas cut date range查询日期
- mysql - 我看不到 mysql.user 表,我需要恢复 root 密码
- javascript - 无法在画布中调整图像大小 - Javascript
- docker - 如何使用星号 16 创建 Docker 容器