Example #1
0
def test_entropy_bernoulli_bivariate__ci_():
    rng = gen_rng(10)

    # Generate a bivariate Bernoulli dataset.
    PX = [.3, .7]
    PY = [[.2, .8], [.6, .4]]
    TX = rng.choice([0, 1], p=PX, size=250)
    TY = np.zeros(shape=len(TX))
    TY[TX == 0] = rng.choice([0, 1], p=PY[0], size=len(TX[TX == 0]))
    TY[TX == 1] = rng.choice([0, 1], p=PY[0], size=len(TX[TX == 1]))
    T = np.column_stack((TY, TX))

    engine = Engine(
        T,
        cctypes=['categorical', 'categorical'],
        distargs=[{
            'k': 2
        }, {
            'k': 2
        }],
        num_states=64,
        rng=rng,
    )

    engine.transition_lovecat(N=200)

    # exact computation
    entropy_exact = (-PX[0] * PY[0][0] * np.log(PX[0] * PY[0][0]) -
                     PX[0] * PY[0][1] * np.log(PX[0] * PY[0][1]) -
                     PX[1] * PY[1][0] * np.log(PX[1] * PY[1][0]) -
                     PX[1] * PY[1][1] * np.log(PX[1] * PY[1][1]))

    # logpdf computation
    logps = engine.logpdf_bulk([-1, -1, -1, -1], [{
        0: 0,
        1: 0
    }, {
        0: 0,
        1: 1
    }, {
        0: 1,
        1: 0
    }, {
        0: 1,
        1: 1
    }])
    entropy_logpdf = [-np.sum(np.exp(logp) * logp) for logp in logps]

    # mutual_information computation.
    entropy_mi = engine.mutual_information([0, 1], [0, 1], N=1000)

    # Punt CLT analysis and go for a small tolerance.
    assert np.allclose(entropy_exact, entropy_logpdf, atol=.15)
    assert np.allclose(entropy_exact, entropy_mi, atol=.15)
    assert np.allclose(entropy_logpdf, entropy_mi, atol=.1)
Example #2
0
def test_entropy_bernoulli_univariate__ci_():
    rng = gen_rng(10)

    # Generate a univariate Bernoulli dataset.
    T = rng.choice([0,1], p=[.3,.7], size=250).reshape(-1,1)

    engine = Engine(T, cctypes=['bernoulli'], rng=rng, num_states=16)
    engine.transition(S=15)

    # exact computation.
    entropy_exact = - (.3*np.log(.3) + .7*np.log(.7))

    # logpdf computation.
    logps = engine.logpdf_bulk([-1,-1], [{0:0}, {0:1}])
    entropy_logpdf = [-np.sum(np.exp(logp)*logp) for logp in logps]

    # mutual_information computation.
    entropy_mi = engine.mutual_information([0], [0], N=1000)

    # Punt CLT analysis and go for 1 dp.
    assert np.allclose(entropy_exact, entropy_logpdf, atol=.1)
    assert np.allclose(entropy_exact, entropy_mi, atol=.1)
    assert np.allclose(entropy_logpdf, entropy_mi, atol=.05)