использование именованных моделей в модуле symfit python для подгонки с гауссовым распределением - PullRequest
1 голос
/ 07 января 2020

Я пытаюсь написать код для подбора двух наборов данных с двумя различными уравнениями с некоторыми общими параметрами одновременно с модулем 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' не определено "

1 Ответ

0 голосов
/ 07 января 2020

Вы можете попробовать заменить Model на GradientModel или даже CallableModel. Проблема возникает из-за того, что по умолчанию вычисляется гессиан модели, а для гауссиана получается DiracDelta, что не упрощается. Использование любой из этих других моделей не приводит к вычислению гессиана и поэтому должно решить проблему. Итак,

from symfit import CallableModel

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

Кроме того, какую версию вы используете? В symfit >= 0.5.2 этого больше не должно происходить, поэтому мне было бы интересно узнать:).

...