def test_mixed_2(histogram): conditions = ( HistogramCondition(histogram["xs"], histogram["densities"]), IntervalCondition(p=0.4, max=1), IntervalCondition(p=0.45, max=1.2), IntervalCondition(p=0.48, max=1.3), IntervalCondition(p=0.5, max=2), IntervalCondition(p=0.7, max=2.2), IntervalCondition(p=0.9, max=2.3), ) dist = LogisticMixture.from_conditions(conditions, num_components=3, verbose=True) assert dist.pdf1(-5) == pytest.approx(0, abs=0.1) assert dist.pdf1(6) == pytest.approx(0, abs=0.1) my_cache = {} my_cache[conditions] = 3 conditions_2 = ( HistogramCondition(histogram["xs"], histogram["densities"]), IntervalCondition(p=0.4, max=1), IntervalCondition(p=0.45, max=1.2), IntervalCondition(p=0.48, max=1.3), IntervalCondition(p=0.5, max=2), IntervalCondition(p=0.7, max=2.2), IntervalCondition(p=0.9, max=2.3), ) assert hash(conditions) == hash(conditions_2) assert my_cache[conditions_2] == 3
def test_mixture_from_histogram(histogram): conditions = [HistogramCondition(histogram["xs"], histogram["densities"])] mixture = LogisticMixture.from_conditions(conditions, num_components=3, verbose=True) for (x, density) in zip(histogram["xs"], histogram["densities"]): assert mixture.pdf1(x) == pytest.approx(density, abs=0.2)
def test_mixture_from_percentile(): for value in [0.01, 0.1, 1, 3]: conditions = [IntervalCondition(p=0.5, max=value)] dist = LogisticMixture.from_conditions(conditions, num_components=1, verbose=True) loc = dist.components[0].loc assert loc == pytest.approx(value, rel=0.1), loc
def test_mixture_from_percentile(): for value in [0.01, 0.1, 1, 3]: conditions = [IntervalCondition(p=0.5, max=value)] dist = LogisticMixture.from_conditions(conditions, {"num_components": 1}, verbose=True, scale=Scale(0, 3)) loc = dist.components[0].base_dist.true_loc assert loc == pytest.approx(value, rel=0.1), loc
def test_mixture_from_histogram(histogram): conditions = [HistogramCondition(histogram["xs"], histogram["densities"])] mixture = LogisticMixture.from_conditions( conditions, {"num_components": 3}, Scale(min(histogram["xs"]), max(histogram["xs"])), ) for (x, density) in zip(histogram["xs"], histogram["densities"]): assert mixture.pdf(x) == pytest.approx(density, abs=0.2)
def test_weights_mixture(): conditions = [ IntervalCondition(p=0.4, max=1, weight=0.01), IntervalCondition(p=0.5, max=2, weight=100), IntervalCondition(p=0.8, max=2.2, weight=0.01), IntervalCondition(p=0.9, max=2.3, weight=0.01), ] dist = LogisticMixture.from_conditions(conditions, num_components=1, verbose=True) assert dist.components[0].loc == pytest.approx(2, rel=0.1)
def test_mixture_from_percentiles(): conditions = [ IntervalCondition(p=0.1, max=1), IntervalCondition(p=0.5, max=2), IntervalCondition(p=0.6, max=3), ] dist = LogisticMixture.from_conditions(conditions, num_components=3, verbose=True) for condition in conditions: assert dist.cdf(condition.max) == pytest.approx(condition.p, rel=0.1)
def test_weights_mixture(): conditions = [ IntervalCondition(p=0.4, max=1, weight=0.01), IntervalCondition(p=0.5, max=2, weight=100), IntervalCondition(p=0.8, max=2.2, weight=0.01), IntervalCondition(p=0.9, max=2.3, weight=0.01), ] dist = LogisticMixture.from_conditions(conditions, {"num_components": 1}, verbose=True, scale=Scale(0, 3)) assert dist.components[0].base_dist.true_loc == pytest.approx(2, rel=0.1)
def test_mixture_from_percentiles(): conditions = [ IntervalCondition(p=0.1, max=1), IntervalCondition(p=0.5, max=2), IntervalCondition(p=0.6, max=3), ] dist = LogisticMixture.from_conditions(conditions, {"num_components": 4}, verbose=False, scale=Scale(0, 3)) for condition in conditions: assert dist.cdf(condition.max) == pytest.approx(condition.p, rel=0.1)
def test_percentile_roundtrip(): conditions = [ IntervalCondition(p=0.01, max=0.61081324517545), IntervalCondition(p=0.1, max=0.8613634657212543), IntervalCondition(p=0.25, max=1), IntervalCondition(p=0.5, max=1.5), IntervalCondition(p=0.75, max=2), IntervalCondition(p=0.9, max=2.1386364698410034), IntervalCondition(p=0.99, max=2.3891870975494385), ] mixture = LogisticMixture.from_conditions(conditions, num_components=3, verbose=True) recovered_conditions = mixture.percentiles( percentiles=[condition.p for condition in conditions]) for (condition, recovered_condition) in zip(conditions, recovered_conditions): assert recovered_condition.max == pytest.approx(condition.max, rel=0.1)