def test_mean(scale: Scale): true_mean = scale.low + scale.width / 2 rv = norm(loc=true_mean, scale=scale.width / 10) xs = constants.target_xs pairs = [{ "x": x, "density": rv.pdf(x) } for x in scale.denormalize_points(xs)] pd_norm = PointDensity.from_pairs(pairs, scale) calculated_mean = float(pd_norm.mean()) assert true_mean == pytest.approx(calculated_mean, rel=1e-3, abs=1e-3)
def test_density_norm_denorm_roundtrip(scale: Scale): rv = scipy.stats.logistic(loc=0.5, scale=0.15) normed_xs = np.linspace(0.01, 1, 201) normed_densities_truth_set = rv.pdf(normed_xs) xs = scale.denormalize_points(normed_xs) denormed_densities = scale.denormalize_densities( xs, normed_densities_truth_set) normed_densities = scale.normalize_densities(normed_xs, denormed_densities) assert np.allclose(normed_densities_truth_set, normed_densities) # type: ignore
def point_density_from_scale(scale: Scale): scale_mid = scale.low + scale.width / 2 rv = logistic(loc=scale_mid, scale=scale.width / 30) xs = scale.denormalize_points(constants.target_xs) densities = rv.pdf(xs) pairs = [{ "x": x, "density": density } for (x, density) in zip(xs, densities)] return PointDensity.from_pairs(pairs, scale)
def test_pdf(xscale: Scale): normed_test_loc = 0.5 normed_test_s = 0.1 test_loc = xscale.denormalize_point(normed_test_loc) test_s = normed_test_s * xscale.width ergoLogisticMixture = LogisticMixture( components=[ Logistic( loc=xscale.denormalize_point(0.2), s=0.5 * xscale.width, scale=xscale, ), Logistic(loc=test_loc, s=test_s, scale=xscale), ], probs=[1.8629593e-29, 1.0], ) ergoLogistic = Logistic(loc=test_loc, s=test_s, scale=xscale) ## Make sure it integrates to 1 _xs = xscale.denormalize_points(np.linspace(0, 1, 100)) densities_logistic = np.array([float(ergoLogistic.pdf(x)) for x in _xs]) densities_mixture = np.array( [float(ergoLogisticMixture.pdf(x)) for x in _xs]) auc_logistic = float(trapz(densities_logistic, x=_xs)) auc_mixture = float(trapz(densities_mixture, x=_xs)) assert (1 == pytest.approx(auc_logistic, abs=0.03) == pytest.approx( auc_mixture, abs=0.03)) if not isinstance(xscale, LogScale): scipydist = scipy.stats.logistic(test_loc, test_s) for x in np.linspace(xscale.denormalize_point(0), xscale.denormalize_point(1), 10): assert (scipydist.pdf(x) == pytest.approx( float(ergoLogistic.pdf(x)), rel=1e-3) == pytest.approx( float(ergoLogisticMixture.pdf(x)), rel=1e-3))
def denormalize(self, scale: Scale): denormed_xs = scale.denormalize_points(self.xs) denormed_densities = scale.denormalize_densities(denormed_xs, self.densities) return self.__class__(denormed_xs, denormed_densities, self.weight)