예제 #1
0
def test_divergences_to_kl():
    """
    Tests that the generalized divergences properly fall back to KL for the appropriate values of alpha, and not otherwise.
    """
    test_dists = [get_dists_2(), get_dists_3()]
    for dists in test_dists:
        for dist1 in dists:
            for dist2 in dists:
                assert_almost_equal(alpha_divergence(dist1, dist2, alpha=-1),
                                    kullback_leibler_divergence(dist2, dist1))
                if dist1 != dist2:
                    assert_not_equal(alpha_divergence(dist1, dist2, alpha=0),
                                     kullback_leibler_divergence(dist2, dist1))
                for divergence in [
                        renyi_divergence, tsallis_divergence, alpha_divergence,
                        hellinger_divergence
                ]:
                    assert_almost_equal(
                        divergence(dist1, dist2, alpha=1),
                        kullback_leibler_divergence(dist1, dist2))
                    if dist1 != dist2:
                        assert_not_equal(
                            alpha_divergence(dist1, dist2, alpha=0),
                            kullback_leibler_divergence(dist2, dist1))
                        assert_not_equal(
                            alpha_divergence(dist1, dist2, alpha=2),
                            kullback_leibler_divergence(dist2, dist1))
def test_divergences_to_kl(dists):
    """
    Tests that the generalized divergences properly fall back to KL for the appropriate values of alpha, and not otherwise.
    """
    for dist1, dist2 in combinations(dists, 2):
        assert alpha_divergence(dist1, dist2, alpha=-1) == pytest.approx(kullback_leibler_divergence(dist2, dist1))

        assert alpha_divergence(dist1, dist2, alpha=0) != pytest.approx(kullback_leibler_divergence(dist2, dist1))
        assert alpha_divergence(dist1, dist2, alpha=2) != pytest.approx(kullback_leibler_divergence(dist2, dist1))
def test_alpha_symmetry(alpha, dists):
    """
    Tests the alpha -> -alpha symmetry for the alpha divergence, and a similar
    symmetry for the Hellinger and Renyi divergences.
    """
    for dist1, dist2 in product(dists, repeat=2):
        assert alpha_divergence(dist1, dist2, alpha) == pytest.approx(alpha_divergence(dist2, dist1, -alpha))
        assert (1.-alpha)*hellinger_divergence(dist1, dist2, alpha) == pytest.approx(alpha*hellinger_divergence(dist2, dist1, 1.-alpha))
        assert (1.-alpha)*renyi_divergence(dist1, dist2, alpha) == pytest.approx(alpha*renyi_divergence(dist2, dist1, 1.-alpha))
def test_alpha_symmetry(alpha, dists):
    """
    Tests the alpha -> -alpha symmetry for the alpha divergence, and a similar
    symmetry for the Hellinger and Renyi divergences.
    """
    for dist1, dist2 in product(dists, repeat=2):
        assert alpha_divergence(dist1, dist2, alpha) == pytest.approx(alpha_divergence(dist2, dist1, -alpha))
        assert (1.-alpha)*hellinger_divergence(dist1, dist2, alpha) == pytest.approx(alpha*hellinger_divergence(dist2, dist1, 1.-alpha))
        assert (1.-alpha)*renyi_divergence(dist1, dist2, alpha) == pytest.approx(alpha*renyi_divergence(dist2, dist1, 1.-alpha))
def test_divergences_to_kl(dists):
    """
    Tests that the generalized divergences properly fall back to KL for the appropriate values of alpha, and not otherwise.
    """
    for dist1, dist2 in combinations(dists, 2):
        assert alpha_divergence(dist1, dist2, alpha=-1) == pytest.approx(kullback_leibler_divergence(dist2, dist1))

        assert alpha_divergence(dist1, dist2, alpha=0) != pytest.approx(kullback_leibler_divergence(dist2, dist1))
        assert alpha_divergence(dist1, dist2, alpha=2) != pytest.approx(kullback_leibler_divergence(dist2, dist1))
def test_alpha_symmetry():
    """
    Tests the alpha -> -alpha symmetry for the alpha divergence, and a similar symmetry for the Hellinger divergence.
    """
    alphas = [-1, 0, 0.5, 1, 2]
    test_dists = [get_dists_2(), get_dists_3()]
    for alpha in alphas:
        for dists in test_dists:
            for dist1 in dists:
                for dist2 in dists:
                    assert_almost_equal(alpha_divergence(dist1, dist2, alpha), alpha_divergence(dist2, dist1, -alpha))
                    assert_almost_equal((1.-alpha)*hellinger_divergence(dist1, dist2, alpha), alpha*hellinger_divergence(dist2, dist1, 1.-alpha))
def test_divergences_to_kl():
    """
    Tests that the generalized divergences properly fall back to KL for the appropriate values of alpha, and not otherwise.
    """
    test_dists = [get_dists_2(), get_dists_3()]
    for dists in test_dists:
        for dist1 in dists:
            for dist2 in dists:
                assert_almost_equal(alpha_divergence(dist1, dist2, alpha=-1), kullback_leibler_divergence(dist2, dist1))
                if dist1 != dist2:
                    assert_not_equal(alpha_divergence(dist1, dist2, alpha=0), kullback_leibler_divergence(dist2, dist1))
                for divergence in [renyi_divergence, tsallis_divergence, alpha_divergence, hellinger_divergence]:
                    assert_almost_equal(divergence(dist1, dist2, alpha=1), kullback_leibler_divergence(dist1, dist2))
                    if dist1 != dist2:
                        assert_not_equal(alpha_divergence(dist1, dist2, alpha=0), kullback_leibler_divergence(dist2, dist1))
                        assert_not_equal(alpha_divergence(dist1, dist2, alpha=2), kullback_leibler_divergence(dist2, dist1))
def test_divergences_to_kl():
    """
    Tests that the generalized divergences properly fall back to KL for the appropriate values of alpha, and not otherwise.
    """
    test_dists = [get_dists_2(), get_dists_3()]
    for dists in test_dists:
        for dist1, dist2 in product(dists, repeat=2):
            assert_almost_equal(alpha_divergence(dist1, dist2, alpha=-1), kullback_leibler_divergence(dist2, dist1))

            if dist1 is not dist2:
                assert_not_equal(alpha_divergence(dist1, dist2, alpha=0), kullback_leibler_divergence(dist2, dist1))

            for divergence in divergences:

                assert_almost_equal(divergence(dist1, dist2, alpha=1), kullback_leibler_divergence(dist1, dist2))

                if dist1 is not dist2:
                    assert_not_equal(alpha_divergence(dist1, dist2, alpha=0), kullback_leibler_divergence(dist2, dist1))
                    assert_not_equal(alpha_divergence(dist1, dist2, alpha=2), kullback_leibler_divergence(dist2, dist1))
예제 #9
0
def test_alpha_symmetry():
    """
    Tests the alpha -> -alpha symmetry for the alpha divergence, and a similar 
    symmetry for the Hellinger and Renyi divergences.
    """
    alphas = [-1, 0, 0.5, 1, 2]
    test_dists = [get_dists_2(), get_dists_3()]
    for alpha in alphas:
        for dists in test_dists:
            for dist1 in dists:
                for dist2 in dists:
                    assert_almost_equal(alpha_divergence(dist1, dist2, alpha),
                                        alpha_divergence(dist2, dist1, -alpha))
                    assert_almost_equal(
                        (1. - alpha) *
                        hellinger_divergence(dist1, dist2, alpha),
                        alpha * hellinger_divergence(dist2, dist1, 1. - alpha))
                    assert_almost_equal(
                        (1. - alpha) * renyi_divergence(dist1, dist2, alpha),
                        alpha * renyi_divergence(dist2, dist1, 1. - alpha))