def _build_gaussian_process_test_data(self, test_environment): """Build up a Gaussian Process randomly by repeatedly drawing from and then adding to the prior. :param test_environment: parameters describing how to construct a GP prior :type test_environment: GaussianProcessTestEnvironmentInput :return: gaussian process environments that can be used to run tests :rtype: GaussianProcessTestEnvironment """ covariance = gp_utils.fill_random_covariance_hyperparameters( test_environment.hyperparameter_interval, test_environment.num_hyperparameters, covariance_type=test_environment.covariance_class, ) domain_bounds = gp_utils.fill_random_domain_bounds( test_environment.lower_bound_interval, test_environment.upper_bound_interval, test_environment.dim, ) domain = test_environment.spatial_domain_class(ClosedInterval.build_closed_intervals_from_list(domain_bounds)) points_sampled = domain.generate_uniform_random_points_in_domain(test_environment.num_sampled) gaussian_process = gp_utils.build_random_gaussian_process( points_sampled, covariance, noise_variance=test_environment.noise_variance, gaussian_process_type=test_environment.gaussian_process_class, ) return GaussianProcessTestEnvironment(domain, gaussian_process)
def _build_gaussian_process_test_data(self, test_environment): """Build up a Gaussian Process randomly by repeatedly drawing from and then adding to the prior. :param test_environment: parameters describing how to construct a GP prior :type test_environment: GaussianProcessTestEnvironmentInput :return: gaussian process environments that can be used to run tests :rtype: GaussianProcessTestEnvironment """ covariance = gp_utils.fill_random_covariance_hyperparameters( test_environment.hyperparameter_interval, test_environment.num_hyperparameters, covariance_type=test_environment.covariance_class, ) domain_bounds = gp_utils.fill_random_domain_bounds( test_environment.lower_bound_interval, test_environment.upper_bound_interval, test_environment.dim, ) domain = test_environment.spatial_domain_class( ClosedInterval.build_closed_intervals_from_list(domain_bounds)) points_sampled = domain.generate_uniform_random_points_in_domain( test_environment.num_sampled) gaussian_process = gp_utils.build_random_gaussian_process( points_sampled, covariance, noise_variance=test_environment.noise_variance, gaussian_process_type=test_environment.gaussian_process_class, ) return GaussianProcessTestEnvironment(domain, gaussian_process)
def test_hyperparameter_gradient_pings(self): """Ping test (compare analytic result to finite difference) the gradient wrt hyperparameters.""" h = 2.0e-3 tolerance = 4.0e-5 num_tests = 10 dim = 3 num_hyperparameters = dim + 1 hyperparameter_interval = ClosedInterval(3.0, 5.0) domain = TensorProductDomain( ClosedInterval.build_closed_intervals_from_list([[-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0]])) points1 = domain.generate_uniform_random_points_in_domain(num_tests) points2 = domain.generate_uniform_random_points_in_domain(num_tests) for i in xrange(num_tests): point_one = points1[i, ...] point_two = points2[i, ...] covariance = gp_utils.fill_random_covariance_hyperparameters( hyperparameter_interval, num_hyperparameters, covariance_type=self.CovarianceClass, ) analytic_grad = covariance.hyperparameter_grad_covariance( point_one, point_two) for k in xrange(covariance.num_hyperparameters): hyperparameters_old = covariance.hyperparameters # hyperparamter + h hyperparameters_p = numpy.copy(hyperparameters_old) hyperparameters_p[k] += h covariance.hyperparameters = hyperparameters_p cov_p = covariance.covariance(point_one, point_two) covariance.hyperparameters = hyperparameters_old # hyperparamter - h hyperparameters_m = numpy.copy(hyperparameters_old) hyperparameters_m[k] -= h covariance.hyperparameters = hyperparameters_m cov_m = covariance.covariance(point_one, point_two) covariance.hyperparameters = hyperparameters_old # calculate finite diff fd_grad = (cov_p - cov_m) / (2.0 * h) self.assert_scalar_within_relative(fd_grad, analytic_grad[k], tolerance)
def test_hyperparameter_gradient_pings(self): """Ping test (compare analytic result to finite difference) the gradient wrt hyperparameters.""" h = 2.0e-3 tolerance = 4.0e-5 num_tests = 10 dim = 3 num_hyperparameters = dim + 1 hyperparameter_interval = ClosedInterval(3.0, 5.0) domain = TensorProductDomain(ClosedInterval.build_closed_intervals_from_list([[-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0]])) points1 = domain.generate_uniform_random_points_in_domain(num_tests) points2 = domain.generate_uniform_random_points_in_domain(num_tests) for i in xrange(num_tests): point_one = points1[i, ...] point_two = points2[i, ...] covariance = gp_utils.fill_random_covariance_hyperparameters( hyperparameter_interval, num_hyperparameters, covariance_type=self.CovarianceClass, ) analytic_grad = covariance.hyperparameter_grad_covariance(point_one, point_two) for k in xrange(covariance.num_hyperparameters): hyperparameters_old = covariance.hyperparameters # hyperparamter + h hyperparameters_p = numpy.copy(hyperparameters_old) hyperparameters_p[k] += h covariance.hyperparameters = hyperparameters_p cov_p = covariance.covariance(point_one, point_two) covariance.hyperparameters = hyperparameters_old # hyperparamter - h hyperparameters_m = numpy.copy(hyperparameters_old) hyperparameters_m[k] -= h covariance.hyperparameters = hyperparameters_m cov_m = covariance.covariance(point_one, point_two) covariance.hyperparameters = hyperparameters_old # calculate finite diff fd_grad = (cov_p - cov_m) / (2.0 * h) self.assert_scalar_within_relative(fd_grad, analytic_grad[k], tolerance)