def test_ppf_cdf_round_trip(): mixture = LogisticMixture.from_samples( np.array([0.5, 0.4, 0.8, 0.8, 0.9, 0.95, 0.15, 0.1]), {"num_components": 3}) x = 0.65 prob = mixture.cdf(x) assert mixture.ppf(prob) == pytest.approx(x, rel=1e-3)
def test_fit_mixture_small(): mixture = LogisticMixture.from_samples(np.array([0.1, 0.2, 0.8, 0.9]), num_components=2) for prob in mixture.probs: assert prob == pytest.approx(0.5, 0.1) locs = sorted([component.loc for component in mixture.components]) assert locs[0] == pytest.approx(0.15, abs=0.1) assert locs[1] == pytest.approx(0.85, abs=0.1)
def test_fit_samples(logistic_mixture): data = np.array([logistic_mixture.sample() for _ in range(0, 1000)]) fitted_mixture = LogisticMixture.from_samples(data, {"num_components": 2}) true_locs = sorted([c.loc for c in logistic_mixture.components]) true_scales = sorted([c.s for c in logistic_mixture.components]) fitted_locs = sorted([c.loc for c in fitted_mixture.components]) fitted_scales = sorted([c.s for c in fitted_mixture.components]) for (true_loc, fitted_loc) in zip(true_locs, fitted_locs): assert fitted_loc == pytest.approx(float(true_loc), rel=0.2) for (true_scale, fitted_scale) in zip(true_scales, fitted_scales): assert fitted_scale == pytest.approx(float(true_scale), rel=0.2)
def test_fit_mixture_large(): data1 = onp.random.logistic(loc=0.7, scale=0.1, size=1000) data2 = onp.random.logistic(loc=0.4, scale=0.2, size=1000) data = onp.concatenate([data1, data2]) mixture = LogisticMixture.from_samples(data, num_components=2) locs = sorted([component.loc for component in mixture.components]) scales = sorted([component.scale for component in mixture.components]) assert locs[0] == pytest.approx(0.4, abs=0.2) assert locs[1] == pytest.approx(0.7, abs=0.2) assert scales[0] == pytest.approx(0.1, abs=0.2) assert scales[1] == pytest.approx(0.2, abs=0.2)
def test_fit_mixture_small(fixed_params): xscale = Scale(0, 1) mixture = LogisticMixture.from_samples( data=np.array([0.1, 0.2, 0.8, 0.9]), fixed_params=fixed_params, scale=xscale, ) for prob in mixture.probs: assert prob == pytest.approx(0.5, 0.1) locs = sorted( [component.base_dist.loc for component in mixture.components]) assert locs[0] == pytest.approx(0.15, abs=0.1) assert locs[1] == pytest.approx(0.85, abs=0.1)
def test_fit_mixture_large(fixed_params): xscale = Scale(-2, 3) data1 = onp.random.logistic(loc=0.7, scale=0.1, size=1000) data2 = onp.random.logistic(loc=0.4, scale=0.2, size=1000) data = onp.concatenate([data1, data2]) mixture = LogisticMixture.from_samples( data=data, fixed_params=fixed_params, scale=xscale, ) # FIXME: What's going on below with scales? components = sorted([(component.base_dist.loc, component.base_dist.s) for component in mixture.components]) assert components[0][0] == pytest.approx(xscale.normalize_point(0.4), abs=0.2) assert components[1][0] == pytest.approx(xscale.normalize_point(0.7), abs=0.2) assert components[0][1] == pytest.approx(0.2, abs=0.2) assert components[1][1] == pytest.approx(0.1, abs=0.2)