Beispiel #1
0
 def test_posterior_dense_matrix_covariance_operator(self):
     num_vars = 121
     rank = 10
     eval_concurrency = 20
     #randn = np.random.normal(0.,1.,(num_vars,num_vars))
     #prior_covariance = np.dot(randn.T,randn)
     prior_covariance = np.eye(num_vars)
     prior_sqrt_covariance_op = CholeskySqrtCovarianceOperator(
         prior_covariance, eval_concurrency)
     prior = MultivariateGaussian(prior_sqrt_covariance_op)
     comparison_tol = 6e-7
     posterior_covariance_helper(
         prior, rank, comparison_tol, test_sampling=True)
Beispiel #2
0
def generate_and_save_laplace_posterior(
    prior,
    misfit_model,
    num_singular_values,
    svd_history_filename='svd-history.npz',
    Lpost_op_filename='laplace_sqrt_operator.npz',
    num_extra_svd_samples=10,
    fd_eps=2 * np.sqrt(np.finfo(float).eps)):

    if os.path.exists(svd_history_filename):
        raise Exception(
            'File %s already exists. Exiting so as not to overwrite' %
            svd_history_filename)
    if os.path.exists(Lpost_op_filename):
        raise Exception(
            'File %s already exists. Exiting so as not to overwrite' %
            Lpost_op_filename)

    sample = misfit_model.map_point()
    misfit_hessian_operator = MisfitHessianVecOperator(misfit_model,
                                                       sample,
                                                       fd_eps=fd_eps)
    standard_svd_opts = {
        'num_singular_values': num_singular_values,
        'num_extra_samples': num_extra_svd_samples
    }
    svd_opts = {
        'single_pass': True,
        'standard_opts': standard_svd_opts,
        'history_filename': svd_history_filename
    }
    L_post_op = get_laplace_covariance_sqrt_operator(
        prior.sqrt_covariance_operator,
        misfit_hessian_operator,
        svd_opts,
        weights=None,
        min_singular_value=0.0)
    posterior = MultivariateGaussian(L_post_op, misfit_model.map_point())

    L_post_op.save(Lpost_op_filename)
    return L_post_op
Beispiel #3
0
    def help_generate_and_save_laplace_posterior(self, fault_precentage):
        svd_history_filename = 'svd-history.npz'
        Lpost_op_filename = 'laplace_sqrt_operator.npz'
        prior_variance_filename = 'prior-pointwise-variance.npz'
        posterior_variance_filename = 'posterior-pointwise-variance.npz'
        if os.path.exists(svd_history_filename):
            os.remove(svd_history_filename)
        if os.path.exists(Lpost_op_filename):
            os.remove(Lpost_op_filename)
        if os.path.exists(prior_variance_filename):
            os.remove(prior_variance_filename)
        if os.path.exists(posterior_variance_filename):
            os.remove(posterior_variance_filename)

        num_vars = 121
        rank = 20
        eval_concurrency = 2
        prior_covariance = np.eye(num_vars)
        prior_sqrt_covariance_op = CholeskySqrtCovarianceOperator(
            prior_covariance, eval_concurrency, fault_percentage=2)
        prior = MultivariateGaussian(prior_sqrt_covariance_op)

        misfit_model, noise_covariance_inv, obs = \
          setup_quadratic_misfit_problem(prior,rank,noise_sigma2=1)

        # Get analytical mean and covariance
        prior_hessian = np.linalg.inv(prior_covariance)
        exact_laplace_mean, exact_laplace_covariance = \
        laplace_posterior_approximation_for_linear_models(
            misfit_model.Amatrix, prior.mean, prior_hessian,
          noise_covariance_inv, obs)

        # instead of using optimization to find map point just use exact
        # map
        misfit_model.map_point = lambda: exact_laplace_mean

        num_singular_values = prior.num_vars()
        try:
            L_post_op = generate_and_save_laplace_posterior(
                prior,
                misfit_model,
                num_singular_values,
                svd_history_filename=svd_history_filename,
                Lpost_op_filename=Lpost_op_filename,
                num_extra_svd_samples=30,
                fd_eps=None)
        except:
            recovered_svd_data = np.load('randomized_svd_recovery_data.npz')
            X = recovered_svd_data['X']
            Y = recovered_svd_data['Y']
            I = np.where(np.all(np.isfinite(Y), axis=0))[0]
            X = X[:, I]
            Y = Y[:, I]
            Q, R = np.linalg.qr(Y)
            from pyapprox.randomized_svd import svd_using_orthogonal_basis
            U, S, V = svd_using_orthogonal_basis(None, Q, X, Y, True)
            U = U[:, :num_singular_values]
            S = S[:num_singular_values]
            L_post_op = LaplaceSqrtMatVecOperator(prior_sqrt_covariance_op,
                                                  e_r=S,
                                                  V_r=U)
            L_post_op.save(Lpost_op_filename)

        L_post_op_from_file = LaplaceSqrtMatVecOperator(
            prior_sqrt_covariance_op, filename=Lpost_op_filename)

        # turn off faults in prior to allow easy comparison
        prior_sqrt_covariance_op.fault_percentage = 0
        L_post = L_post_op_from_file.apply(np.eye(num_vars), transpose=False)
        L_post_T = L_post_op_from_file.apply(np.eye(num_vars), transpose=True)
        assert_ndarray_allclose(L_post.T, L_post_T, rtol=1e-12)

        # Test posterior covariance operator produced matrix is the same
        # as the exact posterior covariance obtained using analytical formula
        post_covariance = np.dot(L_post, L_post_T)
        assert_ndarray_allclose(exact_laplace_covariance,
                                post_covariance,
                                rtol=5e-7,
                                atol=0.)

        prior_pointwise_variance, posterior_pointwise_variance = \
          generate_and_save_pointwise_variance(
              prior, L_post_op_from_file,
              prior_variance_filename=prior_variance_filename,
              posterior_variance_filename=posterior_variance_filename)
        assert_ndarray_allclose(np.diag(exact_laplace_covariance),
                                posterior_pointwise_variance,
                                rtol=3e-11,
                                atol=0.)

        prior_pointwise_variance=\
          np.load(prior_variance_filename)['prior_pointwise_variance']
        posterior_pointwise_variance=\
          np.load(posterior_variance_filename)['posterior_pointwise_variance']
        assert_ndarray_allclose(np.diag(exact_laplace_covariance),
                                posterior_pointwise_variance,
                                rtol=3e-11,
                                atol=0.)