예제 #1
0
    def test_gradient_posterior_mean(self):
        gp = self.gp_complete

        point = np.array([[80.5]])

        # Test evaluate_grad_quadrature_cross_cov
        grad = gp.evaluate_grad_quadrature_cross_cov(
            point, gp.gp.data['points'], gp.gp.kernel.hypers_values_as_array)

        dh = 0.00001
        finite_diff = FiniteDifferences.forward_difference(
            lambda point: gp.evaluate_quadrature_cross_cov(
                point, gp.gp.data['points'], gp.gp.kernel.
                hypers_values_as_array), point, np.array([dh]))

        for i in xrange(grad.shape[1]):
            npt.assert_almost_equal(finite_diff[0][i], grad[0, i], decimal=1)

        npt.assert_almost_equal(finite_diff[0], grad[0, :], decimal=1)

        # Test gradient_posterior_mean
        gradient = gp.gradient_posterior_mean(point)

        dh = 0.0001
        finite_diff = FiniteDifferences.forward_difference(
            lambda points: gp.compute_posterior_parameters(
                points, only_mean=True)['mean'], point, np.array([dh]))

        npt.assert_almost_equal(finite_diff[0], gradient[0], decimal=5)
예제 #2
0
    def test_evaluate_grad_quadrature_cross_cov_resp_candidate(self):
        candidate_point = np.array([[51.5, 0]])
        points = np.array([[51.3], [30.5], [95.1]])
        parameters = self.gp_complete.gp.kernel.hypers_values_as_array
        sol = self.gp_complete.evaluate_grad_quadrature_cross_cov_resp_candidate(
            candidate_point, points, parameters)

        gp = self.gp_complete

        dh = 0.000001
        finite_diff = FiniteDifferences.forward_difference(
            lambda point: gp.evaluate_quadrature_cross_cov(
                points[0:1, :], point.reshape((1, len(point))), parameters),
            candidate_point[0, :], np.array([dh]))
        npt.assert_almost_equal(sol[0, 0], finite_diff[0][0], decimal=2)
        assert sol[1, 0] == finite_diff[1]

        dh = 0.000001
        finite_diff = FiniteDifferences.forward_difference(
            lambda point: gp.evaluate_quadrature_cross_cov(
                points[1:2, :], point.reshape((1, len(point))), parameters),
            candidate_point[0, :], np.array([dh]))
        npt.assert_almost_equal(sol[0, 1], finite_diff[0][0], decimal=1)
        assert sol[1, 1] == finite_diff[1]

        dh = 0.000001
        finite_diff = FiniteDifferences.forward_difference(
            lambda point: gp.evaluate_quadrature_cross_cov(
                points[2:3, :], point.reshape((1, len(point))), parameters),
            candidate_point[0, :], np.array([dh]))
        npt.assert_almost_equal(sol[0, 2], finite_diff[0][0], decimal=2)
        assert sol[1, 2] == finite_diff[1]
    def test_gradient_respect_parameters_finite_differences(self):
        dh = 0.00000001
        finite_diff = FiniteDifferences.forward_difference(
            lambda params: TasksKernel.evaluate_cov_defined_by_params(params, self.inputs_, 2),
            np.array([2.0, 3.0, 4.0]), np.array([dh]))

        gradient = TasksKernel.evaluate_grad_defined_by_params_respect_params(
            np.array([2.0, 3.0, 4.0]), self.inputs_, 2)

        for i in range(3):
            npt.assert_almost_equal(finite_diff[i], gradient[i],  decimal=4)

        gradient = TasksKernel.evaluate_grad_defined_by_params_respect_params(
            np.array([2.0, 3.0]), self.inputs_, 2, **{'same_correlation': True})

        finite_diff = FiniteDifferences.forward_difference(
            lambda params: TasksKernel.evaluate_cov_defined_by_params(params, self.inputs_, 2,
                                                                      **{'same_correlation': True}),
            np.array([2.0, 3.0]), np.array([dh]))

        for i in range(2):
            npt.assert_almost_equal(finite_diff[i], gradient[i],  decimal=4)

        gradient = TasksKernel.evaluate_grad_defined_by_params_respect_params(
            np.array([2.0]), self.inputs, 1, **{'same_correlation': True})

        finite_diff = FiniteDifferences.forward_difference(
            lambda params: TasksKernel.evaluate_cov_defined_by_params(params, self.inputs, 1,
                                                                      **{'same_correlation': True}),
            np.array([2.0]), np.array([dh]))

        npt.assert_almost_equal(finite_diff[0], gradient[0],  decimal=4)
    def test_gradient_uniform_finite_resp_candidate(self):
        gp = self.gp
        f = self.gp.gp.evaluate_grad_cross_cov_respect_point
        candidate_point = np.array([[40.0, 0]])
        index_points = self.gp.x_domain
        domain_random = self.gp.arguments_expectation['domain_random']
        points = np.array([[39.0], [41.0]])
        parameters_kernel = self.gp.gp.kernel.hypers_values_as_array
        value = gradient_uniform_finite_resp_candidate(
            f, candidate_point, index_points, domain_random, self.gp.w_domain,
            points, parameters_kernel)
        dh = 0.00001
        finite_diff = FiniteDifferences.forward_difference(
            lambda point: gp.evaluate_quadrature_cross_cov(
                points[0:1, :], point.reshape(
                    (1, len(point))), parameters_kernel),
            candidate_point[0, :], np.array([dh]))
        npt.assert_almost_equal(value[0, 0], finite_diff[0])
        assert value[1, 0] == finite_diff[1]

        finite_diff = FiniteDifferences.forward_difference(
            lambda point: gp.evaluate_quadrature_cross_cov(
                points[1:2, :], point.reshape(
                    (1, len(point))), parameters_kernel),
            candidate_point[0, :], np.array([dh]))
        npt.assert_almost_equal(value[0, 1], finite_diff[0])
        assert value[1, 1] == finite_diff[1]
    def test_grad_log_likelihood(self):
        grad = self.complex_gp_2.grad_log_likelihood(1.0, 1.0, np.array([1.0, 0.0, 0.0, 0.0]))

        dh = 0.0000001
        finite_diff = FiniteDifferences.forward_difference(
            lambda params: self.complex_gp_2.log_likelihood(
                params[0], params[1], params[2:]
            ),
            np.array([1.0, 1.0, 1.0, 0.0, 0.0, 0.0]), np.array([dh]))

        for i in range(6):
            npt.assert_almost_equal(finite_diff[i], grad[i])

        grad_2 = self.complex_gp_2.grad_log_likelihood(1.82, 123.1,
                                                       np.array([5.0, 1.0, -5.5, 10.0]))

        dh = 0.00000001
        finite_diff_2 = FiniteDifferences.forward_difference(
            lambda params: self.complex_gp_2.log_likelihood(
                params[0], params[1], params[2:]
            ),
            np.array([1.82, 123.1, 5.0, 1.0, -5.5, 10.0]), np.array([dh]))

        for i in range(6):
            npt.assert_almost_equal(finite_diff_2[i], grad_2[i], decimal=3)

        grad_3 = self.gp_3.grad_log_likelihood(1.82, 123.1, np.array([5.0, 7.3]))
        dh = 0.0000001
        finite_diff_3 = FiniteDifferences.forward_difference(
            lambda params: self.gp_3.log_likelihood(
                params[0], params[1], params[2:]
            ),
            np.array([1.82, 123.1, 5.0, 7.3]), np.array([dh]))
        for i in range(4):
            npt.assert_almost_equal(finite_diff_3[i], grad_3[i], decimal=5)

        grad_4 = self.gp_gaussian.grad_log_likelihood(1.0, 0.0, np.array([14.0, 0.9]))
        dh = 0.0000001
        finite_diff_4 = FiniteDifferences.forward_difference(
            lambda params: self.gp_gaussian.log_likelihood(
                params[0], params[1], params[2:]
            ),
            np.array([1.0, 0.0, 14.0, 0.9]), np.array([dh]))
        for i in range(4):
            npt.assert_almost_equal(finite_diff_4[i], grad_4[i], decimal=5)
    def test_evaluate_gradient_bq(self):
        point = np.array([[91.5]])
        grad = self.ei_2.evaluate_gradient(point)

        dh = 0.0001
        finite_diff = FiniteDifferences.forward_difference(
            lambda point: self.ei_2.evaluate(point.reshape((1, len(point)))),
            np.array([91.5]), np.array([dh]))

        npt.assert_almost_equal(finite_diff[0], grad[0], decimal=2)
    def test_gradient_posterior_parameters(self):
        point = np.array([[49.5]])
        grad = self.gp_gaussian.gradient_posterior_parameters(point)

        dh = 0.0000001
        finite_diff = FiniteDifferences.forward_difference(
            lambda x: self.gp_gaussian.compute_posterior_parameters(
                x.reshape((1, len(x))), only_mean=True)['mean'],
            np.array([49.5]), np.array([dh]))

        npt.assert_almost_equal(grad['mean'], finite_diff[0])

        dh = 0.0000001
        finite_diff = FiniteDifferences.forward_difference(
            lambda x: self.gp_gaussian.compute_posterior_parameters(
                x.reshape((1, len(x))))['cov'],
            np.array([49.5]), np.array([dh]))

        npt.assert_almost_equal(grad['cov'], finite_diff[0])
    def test_grad_respect_point_finite_differences(self):
        dh = 0.000000000001
        inputs_1 = np.array([[2.0, 4.0], [3.0, 5.0]])
        point = np.array([[42.0, 35.0]])
        finite_diff = FiniteDifferences.forward_difference(
            lambda point: self.matern52_.cross_cov(point.reshape([1, 2]),
                                                   inputs_1),
            np.array([42.0, 35.0]), np.array([dh]))

        gradient = self.matern52_.grad_respect_point(point, inputs_1)
        for i in range(2):
            npt.assert_almost_equal(finite_diff[i],
                                    gradient[:, i:i + 1].transpose())
    def test_gradient_respect_parameters_finite_differences(self):
        inputs_1 = np.array([[2.0, 4.0], [3.0, 5.0]])
        dh = 0.00000001
        finite_diff = FiniteDifferences.forward_difference(
            lambda params: ScaledKernel.evaluate_cov_defined_by_params(
                params, inputs_1, 2, *([MATERN52_NAME], )),
            np.array([2.0, 3.0, 4.0]), np.array([dh]))

        gradient = ScaledKernel.evaluate_grad_defined_by_params_respect_params(
            np.array([2.0, 3.0, 4.0]), inputs_1, 2, *([MATERN52_NAME], ))

        for i in range(3):
            npt.assert_almost_equal(finite_diff[i], gradient[i])
    def test_forward_difference(self):

        result = FiniteDifferences.forward_difference(self.f, self.x, self.h)

        base_eval = \
            Matern52.evaluate_cov_defined_by_params(self.x, np.array([[2.0, 0.0], [0.0, 2.0]]), 2)

        for i in result:
            new_x = deepcopy(self.x)
            new_x[i] += self.h[0]
            new_eval = \
                Matern52.evaluate_cov_defined_by_params(
                    new_x, np.array([[2.0, 0.0], [0.0, 2.0]]), 2)
            for j in range(2):
                for h in range(2):
                    assert result[i][j, h] == (new_eval[j, h] - base_eval[j, h]) / self.h[0]
예제 #11
0
    def test_gradient_vector_b(self):
        np.random.seed(5)
        n_points = 10
        points = np.linspace(0, 100, n_points)
        points = points.reshape([n_points, 1])
        tasks = np.random.randint(2, size=(n_points, 1))

        add = [10, -10]
        kernel = Matern52.define_kernel_from_array(1, np.array([100.0, 1.0]))
        function = SampleFunctions.sample_from_gp(points, kernel)

        for i in xrange(n_points):
            function[0, i] += add[tasks[i, 0]]
        points = np.concatenate((points, tasks), axis=1)

        function = function[0, :]

        training_data = {
            'evaluations': list(function),
            'points': points,
            "var_noise": [],
        }

        gaussian_p = GPFittingGaussian(
            [PRODUCT_KERNELS_SEPARABLE, MATERN52_NAME, TASKS_KERNEL_NAME],
            training_data, [2, 1, 2],
            bounds_domain=[[0, 100]])
        gaussian_p = gaussian_p.fit_gp_regression(random_seed=1314938)

        gp = BayesianQuadrature(gaussian_p, [0], UNIFORM_FINITE, {TASKS: 2})
        #  gp = self.gp_complete
        candidate_point = np.array([[84.0, 1]])
        points = np.array([[99.5], [12.1], [70.2]])
        value = gp.gradient_vector_b(candidate_point, points, cache=False)

        dh_ = 0.0000001
        dh = [dh_]
        finite_diff = FiniteDifferences.forward_difference(
            lambda point: gp.compute_posterior_parameters_kg(
                points, point.reshape((1, len(point))), cache=False)['b'],
            candidate_point[0, :], np.array(dh))
        npt.assert_almost_equal(finite_diff[0], value[:, 0], decimal=5)
        assert np.all(finite_diff[1] == value[:, 1])

        value_2 = gp.gradient_vector_b(candidate_point, points, cache=True)
        assert np.all(value_2 == value)