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

问题描述 投票:1回答:1

我正在尝试用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:未定义名称'DiracDelta'”]

python gaussian symfit
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.