首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用symfit python模块中的命名模型来拟合高斯分布

使用symfit python模块中的命名模型来拟合高斯分布
EN

Stack Overflow用户
提问于 2020-01-07 18:40:08
回答 1查看 115关注 0票数 1

我正在尝试写一个代码,用symfit模块同时拟合两个不同的方程和一些共享参数的两个数据集。在这里显示它太复杂了,所以我使用相同的命令显示了另一个更简单的代码。在这里,我尝试用线性函数拟合一系列数据,但斜率为高斯分布。代码如下:

代码语言:javascript
复制
 `
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:没有定义名称'DiracDelta‘“

EN

回答 1

Stack Overflow用户

发布于 2020-01-07 20:30:20

您可以尝试用GradientModel甚至CallableModel替换Model。出现这个问题的原因是,默认情况下会计算模型的Hessian,对于高斯模型,这会产生一个不会被简化的DiracDelta。使用这些其他模型中的任何一个都不会导致计算Hessian,因此应该解决问题。所以,

代码语言:javascript
复制
from symfit import CallableModel

funfit = CallableModel({y: (firstres/firstnorm)})

另外,您使用的是哪个版本?在symfit >= 0.5.2中,这种情况应该不会再发生,所以我很想知道:)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59626774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档