コード例 #1
0
def test_custom_independentvar():
    """Tests using a non-trivial object as an independent variable."""
    npts = 501
    xmin = 1
    xmax = 21
    cen = 8
    obj = Stepper(xmin, xmax, npts)
    y = gaussian(obj.get_x(), amplitude=3.0, center=cen, sigma=2.5)
    y += np.random.normal(scale=0.2, size=npts)

    gmod = Model(gaussian_mod)

    params = gmod.make_params(amplitude=2, center=5, sigma=8)
    out = gmod.fit(y, params, obj=obj)

    assert (out.nvarys == 3)
    assert (out.nfev > 10)
    assert (out.chisqr > 1)
    assert (out.chisqr < 100)
    assert (out.params['sigma'].value < 3)
    assert (out.params['sigma'].value > 2)
    assert (out.params['center'].value > xmin)
    assert (out.params['center'].value < xmax)
    assert (out.params['amplitude'].value > 1)
    assert (out.params['amplitude'].value < 5)
コード例 #2
0
def test_custom_independentvar():
    """Tests using a non-trivial object as an independent variable."""
    npts = 501
    xmin = 1
    xmax = 21
    cen = 8
    obj = Stepper(xmin, xmax, npts)
    y = gaussian(obj.get_x(), amplitude=3.0, center=cen, sigma=2.5)
    y += np.random.normal(scale=0.2, size=npts)

    gmod = Model(gaussian_mod)

    params = gmod.make_params(amplitude=2, center=5, sigma=8)
    out = gmod.fit(y, params, obj=obj)

    assert(out.nvarys == 3)
    assert(out.nfev > 10)
    assert(out.chisqr > 1)
    assert(out.chisqr < 100)
    assert(out.params['sigma'].value < 3)
    assert(out.params['sigma'].value > 2)
    assert(out.params['center'].value > xmin)
    assert(out.params['center'].value < xmax)
    assert(out.params['amplitude'].value > 1)
    assert(out.params['amplitude'].value < 5)
コード例 #3
0
def fitGompertz(x, y, dias):  # fit a logistic function~
    def Gompertz(a, b, c, x):
        return a * np.exp(-1 * np.exp(-b * (x - c)))

    model = Model(Gompertz, independent_vars=["x"])

    params = model.make_params()
    params["a"].value = 10000
    params["b"].value = 0.05
    params["c"].value = 100
    output = model.fit(y, params, x=x)
    amplitude = output.params["a"].value
    amplitude = math.floor(amplitude)
    center = output.params["c"].value
    sigma = output.params["b"].value
    fit = []
    xfit = []
    cumulative = []
    for i in range(61, dias):
        if i == 61:
            xfit.append(i)
            value = amplitude * np.exp(-1 * np.exp(-sigma * (i - center)))
            fit.append(value)
            cumulative.append(0)
        else:
            xfit.append(i)
            value = amplitude * np.exp(-1 * np.exp(-sigma * (i - center)))
            fit.append(value)
            c = value - fit[i - 62]
            cumulative.append(c)
    return amplitude, center, sigma, xfit, fit, cumulative, output.fit_report()
コード例 #4
0
    def _fit_echo(self):

        fit_start, fit_end = self._get_region()

        df = self.data_in_range[(self.data_in_range.index > fit_start)
                                & (self.data_in_range.index < fit_end)]
        # Fit arrays
        fit_variable = self._graph_select.currentText() + '_mean'
        x = np.array(df.index.get_values())
        if self._fit_res_checkbox.isChecked():
            y = df['peak_fit_res'] + self.c.best_val
        else:
            y = df[fit_variable]

        params = Parameters()
        params.add_many(
            ('y0', self.y0.param.value, self.y0.param.vary, self.y0.param.min,
             self.y0.param.max),
            ('A', self.A.param.value, self.A.param.vary, self.A.param.min,
             self.center.param.max),
            ('t2', self.t2.param.value, self.t2.param.vary, self.t2.param.min,
             self.t2.param.max),
        )
        model = Model(echo_decay_curve, independent_vars=['x'])
        result = model.fit(y, x=x, params=params)

        all_time = np.linspace(0.1,
                               self.data_in_range.index.get_values().max(),
                               2000)

        # plot data
        self.echo_fit_line.set_data(x, echo_decay_curve(x=x, **result.values))
        self.echo_fit_extended_line.set_data(
            all_time, echo_decay_curve(x=all_time, **result.values))

        # Подсчитываем данные
        t2 = result.values['t2']
        t2_stderr = result.params.get('t2').stderr
        # Ширина линии в MHz
        delta_f = 10**6 / (np.pi * result.values['t2'])
        delta_f_stderr = delta_f * t2_stderr / t2
        self._ax.set_title(
            "$T_2$: {:0.2f} $\pm$ {:0.2f} $ps$ ({:0.2f} $\pm$ {:0.2f} $MHz$ )".
            format(t2, t2_stderr, delta_f, delta_f_stderr))
        # refresh canvas and rescale
        self._ax.relim()
        self._ax.autoscale_view()
        # update plot
        self._fitting_figure.canvas.draw()
        self._fitting_figure.canvas.flush_events()
        # Populating report
        self.fit_report_text.append(result.fit_report())
        # Populating spinboxes
        self.y0.from_res(result)
        self.A.from_res(result)
        self.t2.from_res(result)
コード例 #5
0
ファイル: piecewiseFit.py プロジェクト: zertan/PTR-Pipeline
def fit_signal(signal,l):
    x1=np.linspace(0,1,len(signal))
    
    piecewiseModel=Model(piecewise_prob)
    piecewiseModel.set_param_hint('l',     value=1,vary=False)
    piecewiseModel.set_param_hint('C',   vary=True,  value=.1,min=0,max=1)
    piecewiseModel.make_params()
    
    res=piecewiseModel.fit(signal,x=x1,weights=np.sin(1.5*x1)+1.5)
    return res
コード例 #6
0
def lmfit_gaussian(x_array, y_array, err_array, x_boundarys):

    # Find indeces for six points in spectrum
    idcsW = np.searchsorted(x_array, x_boundarys)

    # Emission region
    idcsEmis = (x_array[idcsW[2]] <= x_array) & (x_array <= x_array[idcsW[3]])

    # Return left and right continua merged in one array
    idcsCont = (((x_array[idcsW[0]] <= x_array) &
                 (x_array <= x_array[idcsW[1]])) |
                ((x_array[idcsW[4]] <= x_array) &
                 (x_array <= x_array[idcsW[5]]))).squeeze()

    emisWave, emisFlux = x_array[idcsEmis], y_array[idcsEmis]
    contWave, contFlux = x_array[idcsCont], y_array[idcsCont]
    idx_peak = np.argmax(emisFlux)

    fit_model = Model(linear_model, prefix=f'{lineLabel}_cont_')
    fit_model.set_param_hint(f'{lineLabel}_cont_slope', **{
        'value': 0,
        'vary': False
    })
    fit_model.set_param_hint(f'{lineLabel}_cont_intercept', **{
        'value': contFlux.mean(),
        'vary': False
    })

    fit_model += Model(gaussian_model, prefix=f'{lineLabel}_')
    fit_model.set_param_hint(f'{lineLabel}_amp',
                             value=emisFlux[idx_peak] - contFlux.mean())
    fit_model.set_param_hint(f'{lineLabel}_center', value=emisWave[idx_peak])
    fit_model.set_param_hint(f'{lineLabel}_sigma', value=1.0)

    x_fit = x_array[idcsEmis + idcsCont]
    y_fit = y_array[idcsEmis + idcsCont]
    w_fit = 1.0 / err_array[idcsEmis + idcsCont]

    fit_params = fit_model.make_params()
    obs_fit_output = fit_model.fit(y_fit, fit_params, x=x_fit, weights=w_fit)

    # amp = obs_fit_output.params[f"{lineLabel}_amp"].value
    mu = obs_fit_output.params[f"{lineLabel}_center"].value
    sigma = obs_fit_output.params[f"{lineLabel}_sigma"].value

    mu_err = obs_fit_output.params[f"{lineLabel}_center"].stderr
    sigma_err = obs_fit_output.params[f"{lineLabel}_sigma"].stderr

    x_obs, y_obs = obs_fit_output.userkws['x'], obs_fit_output.data
    wave_obs = np.linspace(x_obs[0], x_obs[-1], 500)
    flux_comps_obs = obs_fit_output.eval_components(x=wave_obs)
    flux_obs = flux_comps_obs.get(f'{lineLabel}_cont_',
                                  0.0) + flux_comps_obs[f'{lineLabel}_']

    return x_fit, y_fit, wave_obs, flux_obs, mu, sigma, mu_err, sigma_err
コード例 #7
0
def fitgaussian_lmfit(x,
                      y,
                      weights,
                      return_fit=True,
                      return_uncertainties=False):
    try:
        # noinspection PyUnresolvedReferences
        from lmfit.models import Model, GaussianModel
    except ImportError:
        print(' Need module lmfit to use fitgauss_lmfit')
    # calculate guess
    mod = GaussianModel()
    params = mod.guess(y, x=x)
    guess = np.array([
        params['height'].value, params['center'].value, params['sigma'].value,
        0.0
    ])
    # set up model fit
    gmodel = Model(gauss_function)
    # run model fit
    out = gmodel.fit(y,
                     x=x,
                     a=guess[0],
                     x0=guess[1],
                     sigma=guess[2],
                     dc=guess[3],
                     params=None,
                     weights=weights)
    # extract out parameters
    pfit = [
        out.values['a'], out.values['x0'], out.values['sigma'],
        out.values['dc']
    ]
    # extract out standard errors
    siga = [
        out.params['a'].stderr, out.params['x0'].stderr,
        out.params['sigma'].stderr, out.params['dc'].stderr
    ]
    # return
    if return_fit and return_uncertainties:
        return np.array(pfit), np.array(siga), out.best_fit
    elif return_uncertainties:
        return np.array(pfit), np.array(siga)
    elif return_fit:
        return np.array(pfit), out.best_fit
    else:
        return np.array(pfit)
コード例 #8
0
    def _calc_fit_start_dep_curve(self):
        t2_array = []
        t2_var_array = []
        x_array = []
        # Fit value
        fit_variable_name = self._graph_select.currentText()
        for start_fit_from in self.means[DELAY_TITLE]:
            start_fit_from = float(start_fit_from)
            fit_means = self.means[start_fit_from < self.means[DELAY_TITLE]]
            fit_std = self.std[start_fit_from < self.std[DELAY_TITLE]]

            params = self._init_params()

            model = Model(echo_decay_curve, independent_vars=['x'])
            try:
                result = model.fit(fit_means[fit_variable_name],
                                   x=fit_means[DELAY_TITLE],
                                   params=params,
                                   weights=1 / fit_std[LASER_TITLE]**2)
                t2_array.append(result.params.get('t2').value)
                t2_var_array.append(result.params.get('t2').stderr)
                x_array.append(start_fit_from)
            except TypeError:
                break

        ax = self._fitting_stats_figure.add_subplot(111)
        ax.errorbar(x_array,
                    t2_array,
                    yerr=t2_var_array,
                    fmt='--bo',
                    capthick=2,
                    ecolor='b',
                    alpha=0.9)
        ax.set_xlim([-10, 100])
        ax.set_ylim([0, 2000])
        ax.set_title("Зависимость $T_2$ от точки старта фитирования")
        # refresh canvas and tight layout
        self._fitting_stats_canvas.draw()
        self._fitting_stats_figure.tight_layout()
        self._fit_stats = True
        # Adding to fit report
        self.fit_report_text.append(
            "Зависимость t2 от точки старта фитирования:\n")
        self.fit_report_text.append(" ".join(
            "{:.4f}: {:.2f}".format(x, y) for x, y in zip(x_array, t2_array)))
        self.fit_report_text.append("\n")
コード例 #9
0
ファイル: fit.py プロジェクト: 9dogs/edp
def fit_residuals(df, start_fit_from=0.4, fit_field='fit_lorenz_res', init_params=None):
    """
    Fits residuals with EchoDecay curve
    """
    x = np.array(df[df.index > start_fit_from].index.get_values())
    y = np.array(df[df.index > start_fit_from][fit_field].values)

    echo_model = Model(echo_decay_curve, independent_vars=['x'])
    if init_params:
        params = init_params
    else:
        params = _init_echo_params(0, 500, 50)
    result = echo_model.fit(y, x=x, params=params)

    full_x = np.array(df.index.get_values())
    res_fit_eval = result.eval(x=full_x)
    df['res_echo_fit'] = pd.Series(res_fit_eval, index=df.index)

    return df, result
コード例 #10
0
ファイル: piecewiseFit.py プロジェクト: zertan/PTR-Pipeline
### Korem fit

# fit piecewise using least squares (LM)

piecewiseModel=Model(piecewiseLinear)
piecewiseModel.set_param_hint('Ol',     value=0.5*genomeLen,vary=True,min=0,max=genomeLen)
#piecewiseModel.set_param_hint('Tl',     value=0.6*genomeLen,vary=True,min=0,max=genomeLen)
piecewiseModel.set_param_hint('Tc',     value = np.median(np.log2(y1)), vary=True)
piecewiseModel.set_param_hint('Oc',     value = np.median(np.log2(y1)), vary=True)
piecewiseModel.set_param_hint('delta',  value = 0.545*genomeLen, min=0.45*genomeLen, max=0.55*genomeLen, vary=True)#,expr='Tl-Ol if Tl-Ol > 0 else Ol-Tl')

#piecewiseModel.set_param_hint('Tl',     value=0.6*genomeLen,vary=True,min=0,max=genomeLen,expr='mod(Ol+delta,genLen)')
piecewiseModel.set_param_hint('genLen',   vary=False,  value=genomeLen)
piecewiseModel.make_params()

result=piecewiseModel.fit(np.log2(y1),x=x1)
resR2=R2(result.best_fit,y1)
# var=np.var(abs(np.log2(y1)-result.best_fit), dtype=np.float64)
#med=np.median(np.log2(y1))

# y1=[value for value in y1 if (np.log2(value) < med+1.45*np.sqrt(var)) & (np.log2(value)>med-1.45*np.sqrt(var))]

# x1=np.linspace(0,genomeLen-1,len(y1))

# piecewiseModel=Model(piecewiseLinear)
# piecewiseModel.set_param_hint('Ol',     value=0.3*genomeLen,vary=True,min=0,max=genomeLen)
# piecewiseModel.set_param_hint('Tl',     value=0.6*genomeLen,vary=True,min=0,max=genomeLen)
# piecewiseModel.set_param_hint('Tc',     value = np.median(np.log2(y1)), vary=True)
# piecewiseModel.set_param_hint('Oc',     value = np.median(np.log2(y1)), vary=True)
# #piecewiseModel.set_param_hint('delta',  value = 0.5*genomeLen, min=0.45*genomeLen, max=0.55*genomeLen, vary=True,expr='fabs(Tl-Ol)')
# piecewiseModel.set_param_hint('delta',  value = 0.5*genomeLen,expr='fabs(Tl-Ol)')
コード例 #11
0
            'vary': False
        })

        fit_model += Model(gaussian_model, prefix=f'{lineLabel}_')
        fit_model.set_param_hint(f'{lineLabel}_amplitude',
                                 value=obsLm.peak_flux - obsLm.cont)
        fit_model.set_param_hint(f'{lineLabel}_center', value=obsLm.peak_wave)
        fit_model.set_param_hint(f'{lineLabel}_sigma', value=1.0)

        x_array = wave[idcsEmis + idcsCont]
        y_array = flux_voxel_norm[idcsEmis + idcsCont]
        w_array = 1.0 / np.sqrt(err_voxel_norm[idcsEmis + idcsCont])

        fit_params = fit_model.make_params()
        obs_fit_output = fit_model.fit(y_array,
                                       fit_params,
                                       x=x_array,
                                       weights=w_array)

        amp = obs_fit_output.params[f"{lineLabel}_amplitude"].value
        mu = obs_fit_output.params[f"{lineLabel}_center"].value
        sigma = obs_fit_output.params[f"{lineLabel}_sigma"].value

        vr = c_KMpS * (mu - obsLm.peak_wave) / obsLm.peak_wave
        sigma_vel = c_KMpS * sigma / obsLm.peak_wave

        # print(f'intg flux ({obsLm.intg_flux:.3e}); intg err ({obsLm.intg_err:.3e})')
        output_message = f'Observed frame: amp ({amp:0.2f}); mu ({mu:0.2f}); sigma ({sigma:0.2f}); vr ({vr:0.2f});  sigma_vel ({sigma_vel:0.2f})'
        print(output_message)

        x_obs, y_obs = obs_fit_output.userkws['x'], obs_fit_output.data
        wave_obs = np.linspace(x_obs[0], x_obs[-1], 500)
コード例 #12
0
ファイル: Fiting the data.py プロジェクト: Filip-Rolenec/MT
ydata[35:100] = 20 * xdata[35:100]**0.6
ydata = ydata + np.random.normal(0, 0, 100)
plt.plot(ydata)

# In[39]:

max(xdata)

# In[40]:

ydata

# In[25]:

pw_model = Model(piecewise_linear)
fitted_model = pw_model.fit(ydata, x=xdata)

fitted_model.plot()

# In[21]:


def pw_linear(x, x0, y0, k1, k2):
    if x < x0:
        return (x - x0) * k1 + y0
    else:
        return (x - x0) * k2_y0


# In[23]:
コード例 #13
0
                      ((2 * K4) / Ms)))**0.5)

    if Anisotropy == "IP":
        Kit = Model(KittelIP)

        ntira = 0  # numero de pontos a tirar

        newfields = fields[ntira:]
        newpeak1 = peak[ntira:]

        paramK = Kit.make_params()

        paramK.add("Hintrinsic", value=Hintrinsic)
        paramK.add("G", value=G, min=2.8e6, max=3.1e6)

        Kittelfit = Kit.fit(newpeak1, paramK, field=newfields)
        print(Kittelfit.fit_report())

    elif Anisotropy == "OP":
        Kit = Model(KittelOP)

        ntira = 0  # numero de pontos a tirar

        newfields = fields[ntira:]
        newpeak1 = peak[ntira:]

        paramK = Kit.make_params()

        paramK.add("Hintrinsic", value=Hintrinsic)
        paramK.add("G", value=G, min=2.8e6, max=3.1e6)