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)
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)
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])
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
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)
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([]))
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)
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