Пример #1
0
    def test_simple_all_at_once(self):
        mr = MultiLstSq((), 2)

        A = numpy.hstack((numpy.ones(
            (len(self.x_i), 1)), numpy.array(self.x_i)[:, numpy.newaxis]))
        b = numpy.array(self.y_i)[:, numpy.newaxis]

        mr.add_data(A, b)
        mr.switch_to_variance()
        mr.add_data(A, b)

        mrss = self._construct_mr_step_by_step()

        numpy.testing.assert_array_almost_equal(mr._XtX, mrss._XtX)
        numpy.testing.assert_array_almost_equal(mr._Xty, mrss._Xty)

        numpy.testing.assert_array_almost_equal(mr._rss, mrss._rss)
        numpy.testing.assert_array_almost_equal(mr._n_observations,
                                                mrss._n_observations)

        # x is a vertical vector contataining the solution
        self.assertAlmostEqual(mr.beta[0, 0], -39.062, 3)
        self.assertAlmostEqual(mr.beta[1, 0], 61.272, 3)
        # variance is the variance-covariance matrix
        self.assertAlmostEqual(mr.variance[0, 0], 8.63185, 5)
        self.assertAlmostEqual(mr.variance[1, 1], 3.1539, 4)

        self.assertAlmostEqual(mr.sigma_2, 0.57619680)
Пример #2
0
    def test_regression_vs_numpy(self):
        for dim in range(1, 5):
            X = numpy.random.normal(size=(dim * 2, dim))
            y = numpy.random.normal(size=(dim * 2, 1))

            Xmr = numpy.array([numpy.zeros_like(X), X])
            ymr = numpy.array([numpy.zeros_like(y), y])

            mr = MultiLstSq((2, ), dim)
            mr.add_data(Xmr, ymr)
            mr.switch_to_variance()
            mr.add_data(Xmr, ymr)

            beta_hat = mr.beta[1]
            beta_cov = mr.variance

            # FIXME: is there a way to compute the covariance with numpy directly?
            numpy.testing.assert_almost_equal(
                beta_hat,
                numpy.linalg.lstsq(X, y, rcond=-1)[0])
Пример #3
0
    def test_multilstsq_masked(self):
        mls = MultiLstSq((2, 3), 2)

        # 4 observations
        X = numpy.ma.masked_all((2, 3, 4, 2))
        y = numpy.ma.masked_all((2, 3, 4, 1))

        # This is for β₀
        X[:, :, :, 0] = 1

        # Values of x, as coefficients of β₁
        # The first two dims are the problem index
        # The third is the observation index
        X[0, 0, :, 1] = [1, 2, 3, 4]
        X[0, 1, :, 1] = [1, 2, 1, 2]
        X[0, 2, :, 1] = [1, 1, 1, 1]
        X[1, 0, :, 1] = [-5, -6, 13, 43]
        X[1, 1, :3, 1] = [-1, 0, 1]  # only 3 observations
        X[1, 2, :2, 1] = [4, 8]  # only 2 observations

        # Observations
        y[0, 0, :, 0] = [1, 2, 3, 4]
        y[0, 1, :, 0] = [1.1, 2, 0.9, 2.1]
        y[0, 2, :, 0] = [3, 4, 5, 6]
        y[1, 0, :, 0] = [-5.9, -5.2, 11.9, 42.1]
        y[1, 1, :3, 0] = [1, 2, 3]  # only 3 observations
        y[1, 2, :2, 0] = [4.5, 5]  # only 2 observations

        mls.add_data(X, y)
        mls.switch_to_variance()
        mls.add_data(X, y)

        self.assertEqual(mls.n_observations[0, 0], 4)
        self.assertEqual(mls.n_observations[0, 1], 4)
        self.assertEqual(mls.n_observations[0, 2], 4)
        self.assertEqual(mls.n_observations[1, 0], 4)
        self.assertEqual(mls.n_observations[1, 1], 3)
        self.assertEqual(mls.n_observations[1, 2], 2)
Пример #4
0
    def test_2d_one_by_one(self):
        mr = MultiLstSq((2, 2), 2)

        for i in range(2):
            for x, y in zip(self.x_i, self.y_i):
                A = numpy.array([[[[1, x]]] * 2] * 2)
                b = numpy.array([[[[y]]] * 2] * 2)
                mr.add_data(A, b)

            mr.switch_to_variance()

        mrss = self._construct_mr_step_by_step()

        numpy.testing.assert_array_almost_equal(mr._XtX[0, 0], mrss._XtX)
        numpy.testing.assert_array_almost_equal(mr._XtX[0, 1], mrss._XtX)
        numpy.testing.assert_array_almost_equal(mr._XtX[1, 0], mrss._XtX)
        numpy.testing.assert_array_almost_equal(mr._XtX[1, 1], mrss._XtX)
        numpy.testing.assert_array_almost_equal(mr._Xty[0, 0], mrss._Xty)
        numpy.testing.assert_array_almost_equal(mr._Xty[0, 1], mrss._Xty)
        numpy.testing.assert_array_almost_equal(mr._Xty[1, 0], mrss._Xty)
        numpy.testing.assert_array_almost_equal(mr._Xty[1, 1], mrss._Xty)

        numpy.testing.assert_array_almost_equal(mr._rss[0, 0], mrss._rss)
        numpy.testing.assert_array_almost_equal(mr._rss[0, 1], mrss._rss)
        numpy.testing.assert_array_almost_equal(mr._rss[1, 0], mrss._rss)
        numpy.testing.assert_array_almost_equal(mr._rss[1, 1], mrss._rss)
        numpy.testing.assert_array_almost_equal(mr._n_observations,
                                                mrss._n_observations)

        numpy.testing.assert_array_almost_equal(mr.beta[0, 0], mr.beta[0, 1])
        numpy.testing.assert_array_almost_equal(mr.beta[0, 0], mr.beta[1, 0])
        numpy.testing.assert_array_almost_equal(mr.beta[0, 0], mr.beta[1, 1])

        numpy.testing.assert_array_almost_equal(mr.variance[0, 0],
                                                mr.variance[0, 1])
        numpy.testing.assert_array_almost_equal(mr.variance[0, 0],
                                                mr.variance[1, 0])
        numpy.testing.assert_array_almost_equal(mr.variance[0, 0],
                                                mr.variance[1, 1])

        # x is a vertical vector contataining the solution
        self.assertAlmostEqual(mr.beta[0, 0][0, 0], -39.062, 3)
        self.assertAlmostEqual(mr.beta[0, 0][1, 0], 61.272, 3)
        # variance is the variance-covariance matrix
        self.assertAlmostEqual(mr.variance[0, 0][0, 0], 8.63185, 5)
        self.assertAlmostEqual(mr.variance[0, 0][1, 1], 3.1539, 4)
Пример #5
0
 def test_weights(self):
     mr = MultiLstSq((), 1)
     mr.add_data(numpy.array([[1], [1]]),
                 numpy.array([[0], [3]]),
                 w=numpy.array([[1], [2]]))
     self.assertAlmostEqual(mr.beta[0], 2, 5)
Пример #6
0
    def test_type_validation(self):
        with self.assertRaises(TypeError):
            mr = MultiLstSq([], 1)
        with self.assertRaises(TypeError):
            mr = MultiLstSq((0, 1), 1)
        with self.assertRaises(TypeError):
            mr = MultiLstSq((-1, 1), 1)
        with self.assertRaises(TypeError):
            mr = MultiLstSq((), -1)

        mr = MultiLstSq((), 2)
        with self.assertRaises(ValueError):
            mr.add_data(numpy.array([]), numpy.array([]))
        with self.assertRaises(ValueError):
            mr.add_data(numpy.array([[1, 1]]), numpy.array([]))
        with self.assertRaises(ValueError):
            mr.add_data(numpy.array([[1, 1]]), numpy.array([[1]]),
                        numpy.array([]))
Пример #7
0
    def test_variance(self):
        mr1 = MultiLstSq((), 2)

        for i in range(2):
            for x, y in zip([1, 2, 3], [2.1, 3.9, 6]):
                A = numpy.array([[1, x]])
                b = numpy.array([[y]])
                mr1.add_data(A, b)

            mr1.switch_to_variance()

        mr2 = MultiLstSq((), 2)

        for i in range(2):
            mr2.add_data(numpy.array([[0, 0]]), numpy.array([[0]]))
            mr2.add_data(numpy.array([[0, 0], [0, 0]]), numpy.array([[0],
                                                                     [0]]))

            for x, y in zip([1, 2, 3], [2.1, 3.9, 6]):
                A = numpy.array([[1, x]])
                b = numpy.array([[y]])
                mr2.add_data(A, b)

            mr2.add_data(numpy.array([[0, 0]]), numpy.array([[0]]))
            mr2.add_data(numpy.array([[0, 0]]), numpy.array([[0]]))
            mr2.add_data(numpy.array([[0, 0]]), numpy.array([[0]]))

            mr2.switch_to_variance()

        # print(mr1.x.T)
        # print(mr2.x.T)

        numpy.testing.assert_almost_equal(mr1.beta, mr2.beta)
        numpy.testing.assert_almost_equal(mr1.variance, mr2.variance)

        return mr1
Пример #8
0
    def _construct_mr_step_by_step(self):
        mr = MultiLstSq((), 2)

        for i in range(2):
            for x, y in zip(self.x_i, self.y_i):
                A = numpy.array([[1, x]])
                b = numpy.array([[y]])
                mr.add_data(A, b)

            mr.switch_to_variance()

        mr.switch_to_read_only()

        with self.assertRaises(RuntimeError):
            mr.add_data(A, b)

        with self.assertRaises(RuntimeError):
            mr.switch_to_variance()

        return mr
Пример #9
0
 def test_empty(self):
     mr = MultiLstSq((), 1)
     print(mr.beta)