Beispiel #1
0
    def test_args_kwds_are_used(self):
        # check that user defined args and kwds make their way into the user
        # function
        a = [1., 2.]
        x = np.linspace(0, 10, 11)
        y = a[0] + 1 + 2 * a[1] * x

        par = Parameters()
        par.add('p0', 1.5)
        par.add('p1', 2.5)

        def fun(x, p, *args, **kwds):
            assert_equal(args, a)
            return args[0] + p['p0'] + p['p1'] * a[1] * x

        g = CurveFitter(fun, (x, y), par, fcn_args=a)
        res = g.fit()
        assert_almost_equal(values(res.params), [1., 2.])

        d = {'a': 1, 'b': 2}

        def fun(x, p, *args, **kwds):
            return kwds['a'] + p['p0'] + p['p1'] * kwds['b'] * x

        g = CurveFitter(fun, (x, y), par, fcn_kws=d)
        res = g.fit()
        assert_almost_equal(values(res.params), [1., 2.])
Beispiel #2
0
 def test_reflectivity_fit(self):
     # a smoke test to make sure the reflectivity fit proceeds
     fitfunc = reflect.ReflectivityFitFunction()
     transform = reflect.Transform('logY')
     yt, et = transform.transform(self.qvals361,
                                  self.rvals361,
                                  self.evals361)
     kws = {'transform': transform.transform}
     fitter2 = CurveFitter(fitfunc,
                           (self.qvals361, yt, et),
                           self.params361,
                           fcn_kws=kws,
                           kws={'seed': 2})
     fitter2.fit('differential_evolution')
Beispiel #3
0
    def test_costfun(self):
        # test user defined costfun
        res = self.f.fit('nelder')

        def costfun(params, generative, y, e):
            return np.sum((y - generative / e) ** 2)

        g = CurveFitter(gauss, (self.xdata, self.ydata), self.params, costfun=costfun)
        res2 = g.fit('nelder')
        assert_almost_equal(self.pvals(res.params), self.pvals(res2.params))
Beispiel #4
0
    def test_best_weighted(self):
        f = CurveFitter(gauss, (self.xvals, self.yvals, self.evals), self.params)
        res = f.fit()

        output = list(res.params.valuesdict().values())
        assert_almost_equal(output, self.best_weighted, 4)
        assert_almost_equal(res.chisqr, self.best_weighted_chisqr)

        uncertainties = [res.params['p%d' % i].stderr for i in range(4)]
        assert_almost_equal(uncertainties, self.best_weighted_errors, 3)
Beispiel #5
0
    def test_reflectivity_fit(self):
        # a smoke test to make sure the reflectivity fit proceeds
        params = curvefitter.to_parameters(self.coefs)
        params['p1'].value = 1.1

        fitfunc = reflect.ReflectivityFitFunction()
        fitter = CurveFitter(fitfunc, self.qvals, self.rvals, params)
        fitter.fit()

        transform = reflect.Transform('logY')
        yt, et = transform.transform(self.qvals361,
                                     self.rvals361,
                                     self.evals361)
        kws = {'transform':transform.transform}
        fitter2 = CurveFitter(fitfunc,
                              self.qvals361,
                              yt,
                              self.params361,
                              edata=et,
                              fcn_kws=kws)
        fitter2.fit('differential_evolution')
Beispiel #6
0
    def test_reflectivity_emcee(self):
        transform = reflect.Transform('logY')
        yt, et = transform.transform(self.qvals361,
                                     self.rvals361,
                                     self.evals361)

        kws = {'transform': transform.transform}
        fitfunc = RFF(transform=transform.transform, dq=5.)

        fitter = CurveFitter(fitfunc,
                             (self.qvals361, yt, et),
                             self.params361,
                             fcn_kws=kws)
        res = fitter.fit()
        res_em = fitter.emcee(steps=10)
Beispiel #7
0
    def test_reflectivity_emcee(self):
        transform = reflect.Transform('logY')
        yt, et = transform.transform(self.qvals361,
                                     self.rvals361,
                                     self.evals361)

        kws = {'transform': transform.transform}
        fitfunc = RFF(transform=transform.transform, dq=5.)

        fitter = CurveFitter(fitfunc,
                             (self.qvals361, yt, et),
                             self.params361,
                             fcn_kws=kws)
        res = fitter.fit()
        res_em = fitter.emcee(steps=10, seed=1)
        assert_allclose(values(res.params), values(res_em.params), rtol=1e-2)
Beispiel #8
0
class TestFitter(unittest.TestCase):

    def setUp(self):
        self.xdata = np.linspace(-4, 4, 100)
        self.p0 = np.array([0., 1., 0.0, 1.])
        self.bounds = [(-1, 1), (0, 2), (-1, 1.), (0.001, 2)]

        self.params = curvefitter.to_parameters(self.p0 + 0.2,
                                                bounds=self.bounds)
        self.final_params = curvefitter.to_parameters(self.p0,
                                                      bounds=self.bounds)

        self.ydata = gauss(self.xdata, self.final_params)
        self.f = CurveFitter(gauss, (self.xdata, self.ydata), self.params)

    def test_fitting(self):
        # the simplest test - a really simple gauss curve with perfect data
        res = self.f.fit()
        assert_almost_equal(values(res.params), self.p0)
        assert_almost_equal(res.chisqr, 0)

    def test_NIST(self):
        # Run all the NIST standard tests with leastsq
        for model in Models:
            try:
                NIST_runner(model)
            except Exception:
                print(model)
                raise

    def test_model_returns_function(self):
        ydata = gauss(self.xdata, self.final_params)
        model = self.f.model(self.final_params)
        assert_almost_equal(ydata, model)

    def test_residuals(self):
        resid = self.f.residuals(self.final_params)
        assert_almost_equal(np.sum(resid**2), 0)

    def test_cost(self):
        resid = self.f.residuals(self.final_params)
        assert_almost_equal(0, np.sum(resid**2))

    def test_leastsq(self):
        # test that a custom method can be used with scipy.optimize.minimize
        res = self.f.fit()
        assert_almost_equal(values(res.params), self.p0)

    def test_resid_length(self):
        # the residuals length should be equal to the data length
        resid = self.f.residuals(self.params)
        assert_equal(resid.size, self.f.dataset.y.size)

    def test_scalar_minimize(self):
        assert_equal(values(self.params), self.p0 + 0.2)
        res = self.f.fit(method='differential_evolution')
        assert_almost_equal(values(res.params), self.p0, 3)

    def test_holding_parameter(self):
        # holding parameters means that those parameters shouldn't change
        # during a fit
        self.params['p0'].vary = False
        res = self.f.fit()
        assert_almost_equal(self.p0[0] + 0.2, self.params['p0'].value)
        assert_almost_equal(res.params['p0'].value, self.params['p0'].value)

    def test_fit_returns_MinimizerResult(self):
        self.params['p0'].vary = False
        res = self.f.fit()
        assert_(isinstance(res, MinimizerResult))

    def test_costfun(self):
        # test user defined costfun
        res = self.f.fit('nelder')

        def costfun(params, generative, y, e):
            return np.sum((y - generative / e) ** 2)

        g = CurveFitter(gauss,
                        (self.xdata, self.ydata),
                        self.params,
                        costfun=costfun)

        res2 = g.fit('nelder')
        assert_almost_equal(values(res.params), values(res2.params))

    def test_args_kwds_are_used(self):
        # check that user defined args and kwds make their way into the user
        # function
        a = [1., 2.]
        x = np.linspace(0, 10, 11)
        y = a[0] + 1 + 2 * a[1] * x

        par = Parameters()
        par.add('p0', 1.5)
        par.add('p1', 2.5)

        def fun(x, p, *args, **kwds):
            assert_equal(args, a)
            return args[0] + p['p0'] + p['p1'] * a[1] * x

        g = CurveFitter(fun, (x, y), par, fcn_args=a)
        res = g.fit()
        assert_almost_equal(values(res.params), [1., 2.])

        d = {'a': 1, 'b': 2}

        def fun(x, p, *args, **kwds):
            return kwds['a'] + p['p0'] + p['p1'] * kwds['b'] * x

        g = CurveFitter(fun, (x, y), par, fcn_kws=d)
        res = g.fit()
        assert_almost_equal(values(res.params), [1., 2.])
Beispiel #9
0
class TestFitter(unittest.TestCase):

    def setUp(self):
        self.xdata = np.linspace(-4, 4, 100)
        self.p0 = np.array([0., 1., 0.0, 1.])
        self.bounds = [(-1, 1), (0, 2), (-1, 1.), (0.001, 2)]

        self.params = curvefitter.to_parameters(self.p0 + 0.2, bounds=self.bounds)
        self.final_params = curvefitter.to_parameters(self.p0, bounds=self.bounds)

        self.ydata = gauss(self.xdata, self.final_params)
        self.f = CurveFitter(gauss, (self.xdata, self.ydata), self.params)

    def pvals(self, params):
        return np.asfarray(list(params.valuesdict().values()))

    def test_fitting(self):
        # the simplest test - a really simple gauss curve with perfect data
        res = self.f.fit()
        assert_almost_equal(self.pvals(res.params), self.p0)
        assert_almost_equal(res.chisqr, 0)

    def test_NIST(self):
        # Run all the NIST standard tests with leastsq
        for model in Models.keys():
            try:
                NIST_runner(model)
            except Exception:
                print(model)
                raise

    def test_model_returns_function(self):
        ydata = gauss(self.xdata, self.final_params)
        model = self.f.model(self.final_params)
        assert_almost_equal(ydata, model)

    def test_residuals(self):
        resid = self.f.residuals(self.final_params)
        assert_almost_equal(np.sum(resid**2), 0)

    def test_cost(self):
        resid = self.f.residuals(self.final_params)
        assert_almost_equal(0, np.sum(resid**2))

    def test_leastsq(self):
        # test that a custom method can be used with scipy.optimize.minimize
        res = self.f.fit()
        assert_almost_equal(self.pvals(res.params), self.p0)

    def test_resid_length(self):
        # the residuals length should be equal to the data length
        resid = self.f.residuals(self.params)
        assert_equal(resid.size, self.f.ydata.size)

    def test_scalar_minimize(self):
        assert_equal(self.pvals(self.params), self.p0 + 0.2)
        res = self.f.fit(method='differential_evolution')
        assert_almost_equal(self.pvals(res.params), self.p0, 3)

    def test_holding_parameter(self):
        # holding parameters means that those parameters shouldn't change
        # during a fit
        self.params['p0'].vary = False
        res = self.f.fit()
        assert_almost_equal(self.p0[0] + 0.2, self.params['p0'].value)

    def test_fit_returns_MinimizerResult(self):
        self.params['p0'].vary = False
        res = self.f.fit()
        assert_(isinstance(res, MinimizerResult))

    def test_costfun(self):
        # test user defined costfun
        res = self.f.fit('nelder')

        def costfun(params, generative, y, e):
            return np.sum((y - generative / e) ** 2)

        g = CurveFitter(gauss, (self.xdata, self.ydata), self.params, costfun=costfun)
        res2 = g.fit('nelder')
        assert_almost_equal(self.pvals(res.params), self.pvals(res2.params))