Source code for lenstronomy.Cosmo.kde_likelihood

import numpy as np
from scipy import stats

__all__ = ["KDELikelihood"]


[docs] class KDELikelihood(object): """Class that samples the cosmographic likelihood given a distribution of points in the 2-dimensional distribution of D_d and D_delta_t."""
[docs] def __init__( self, D_d_sample, D_delta_t_sample, kde_type="scipy_gaussian", bandwidth=1 ): """ :param D_d_sample: 1-d numpy array of angular diameter distances to the lens plane :param D_delta_t_sample: 1-d numpy array of time-delay distances :param kde_type: The kernel to use. Valid kernels are 'scipy_gaussian' or ['gaussian'|'tophat'|'epanechnikov'|'exponential'|'linear'|'cosine'] Default is 'gaussian'. :type kde_type: string :param bandwidth: width of kernel (in same units as the angular diameter quantities) """ values = np.vstack([D_d_sample, D_delta_t_sample]) if kde_type == "scipy_gaussian": self._PDF_kernel = stats.gaussian_kde(values) else: from sklearn.neighbors import KernelDensity self._kde = KernelDensity(bandwidth=bandwidth, kernel=kde_type) values = np.vstack([D_d_sample, D_delta_t_sample]) self._kde.fit(values.T) self._kde_type = kde_type
[docs] def logLikelihood(self, D_d, D_delta_t): """Likelihood of the data (represented in the distribution of this class) given a model with predicted angular diameter distances. :param D_d: model predicted angular diameter distance :param D_delta_t: model predicted time-delay distance :return: loglikelihood (log of KDE value) """ if self._kde_type == "scipy_gaussian": density = self._PDF_kernel([D_d, D_delta_t]) logL = np.log(density) else: x = np.array([[D_d], [D_delta_t]]) logL = self._kde.score_samples(x.T) return logL