def test_log_marg_k():

    np.random.seed(1)

    # Generate data
    D = 10
    N_1 = 10
    X_1 = 5*np.random.rand(N_1, D) - 1

    # Prior
    var = 10*np.random.rand(D)
    mu_0 = 5*np.random.rand(D) - 2
    var_0 = 2*np.random.rand(D)
    prior = FixedVarPrior(var, mu_0, var_0)
    precision = 1./var
    precision_0 = 1./var_0

    # Setup GMM
    assignments = np.concatenate([np.zeros(N_1)])
    gmm = GaussianComponentsFixedVar(X_1, prior, assignments=assignments)

    # Calculate marginal for component by hand
    expected_log_marg = np.sum(np.log([
        np.sqrt(var[i])/(np.sqrt(2*np.pi*var[i])**N_1*np.sqrt(N_1*var_0[i] + var[i])) *
        np.exp(-0.5*np.square(X_1).sum(axis=0)[i] / var[i] - mu_0[i]**2/(2*var_0[i])) *
        np.exp(
            (var_0[i]*N_1**2*X_1.mean(axis=0)[i]**2/var[i] + var[i]*mu_0[i]**2/var_0[i] +
            2*N_1*X_1.mean(axis=0)[i]*mu_0[i]) / (2. * (N_1*var_0[i] + var[i]))
            )
        for i in range(D)
        ]))

    npt.assert_almost_equal(gmm.log_marg_k(0), expected_log_marg)
Пример #2
0
def test_log_marg_k():

    np.random.seed(1)

    # Generate data
    D = 10
    N_1 = 10
    X_1 = 5 * np.random.rand(N_1, D) - 1

    # Prior
    var = 10 * np.random.rand(D)
    mu_0 = 5 * np.random.rand(D) - 2
    var_0 = 2 * np.random.rand(D)
    prior = FixedVarPrior(var, mu_0, var_0)
    precision = 1. / var
    precision_0 = 1. / var_0

    # Setup GMM
    assignments = np.concatenate([np.zeros(N_1)])
    gmm = GaussianComponentsFixedVar(X_1, prior, assignments=assignments)

    # Calculate marginal for component by hand
    expected_log_marg = np.sum(
        np.log([
            np.sqrt(var[i]) / (np.sqrt(2 * np.pi * var[i])**N_1 *
                               np.sqrt(N_1 * var_0[i] + var[i])) *
            np.exp(-0.5 * np.square(X_1).sum(axis=0)[i] / var[i] - mu_0[i]**2 /
                   (2 * var_0[i])) * np.exp(
                       (var_0[i] * N_1**2 * X_1.mean(axis=0)[i]**2 / var[i] +
                        var[i] * mu_0[i]**2 / var_0[i] +
                        2 * N_1 * X_1.mean(axis=0)[i] * mu_0[i]) /
                       (2. * (N_1 * var_0[i] + var[i]))) for i in range(D)
        ]))

    npt.assert_almost_equal(gmm.log_marg_k(0), expected_log_marg)