Exemple #1
0
    def __init__(self, data, T, alpha_beta):
        mu, sigma = compute_uniform_mean_psi(T)
        self.theta_prior = Gaussian(
            mu=mu, sigma=sigma, mu_0=mu, sigma_0=T * sigma / 10.0, nu_0=T / 10.0, kappa_0=1.0 / 10
        )

        self.ppgs = initialize_polya_gamma_samplers()
        self.omega = np.zeros((data.shape[0], T - 1))

        super(StickbreakingCorrelatedLDA, self).__init__(data, T, alpha_beta)
Exemple #2
0
    def _get_lds_effective_params(self):
        mu_uniform, sigma_uniform = compute_uniform_mean_psi(self.V)
        mu_init = np.tile(mu_uniform, self.K)
        sigma_init = np.tile(np.diag(sigma_uniform), self.K)

        sigma_states = np.repeat(self.sigmasq_states, (self.V - 1) * self.K)

        sigma_obs = 1.0 / self.omega
        y = kappa_vec(self.time_word_topic_counts, axis=1) / self.omega

        return mu_init, sigma_init, sigma_states, sigma_obs.reshape(y.shape[0], -1), y.reshape(y.shape[0], -1)
Exemple #3
0
    def _get_lds_effective_params(self):
        mu_uniform, sigma_uniform = compute_uniform_mean_psi(self.V)
        mu_init = np.tile(mu_uniform, self.K)
        sigma_init = np.tile(np.diag(sigma_uniform), self.K)

        sigma_states = np.repeat(self.sigmasq_states, (self.V - 1) * self.K)

        sigma_obs = 1. / self.omega
        y = kappa_vec(self.time_word_topic_counts, axis=1) / self.omega

        return mu_init, sigma_init, sigma_states, \
            sigma_obs.reshape(y.shape[0], -1), y.reshape(y.shape[0], -1)
Exemple #4
0
    def initialize_parameters(self):
        self.sigmasq_states = 0.1  # TODO make this learned, init from hypers

        mean_psi = compute_uniform_mean_psi(self.V)[0][None, :, None]
        self.psi = np.tile(mean_psi, (self.T, 1, self.K))

        self.omega = np.zeros_like(self.psi)

        self.theta = sample_dirichlet(self.alpha_theta * np.ones((self.D, self.K)), "horiz")

        self.z = np.zeros((self.data.data.shape[0], self.K), dtype="uint32")
        self.resample_z()
Exemple #5
0
    def initialize_parameters(self):
        self.sigmasq_states = 0.1  # TODO make this learned, init from hypers

        mean_psi = compute_uniform_mean_psi(self.V)[0][None, :, None]
        self.psi = np.tile(mean_psi, (self.T, 1, self.K))

        self.omega = np.zeros_like(self.psi)

        self.theta = sample_dirichlet(
            self.alpha_theta * np.ones((self.D, self.K)), 'horiz')

        self.z = np.zeros((self.data.data.shape[0], self.K), dtype='uint32')
        self.resample_z()
Exemple #6
0
    def __init__(self, data, T, alpha_beta):
        mu, sigma = compute_uniform_mean_psi(T)
        self.theta_prior = Gaussian(mu=mu,
                                    sigma=sigma,
                                    mu_0=mu,
                                    sigma_0=T * sigma / 10.,
                                    nu_0=T / 10.,
                                    kappa_0=1. / 10)

        self.ppgs = initialize_polya_gamma_samplers()
        self.omega = np.zeros((data.shape[0], T - 1))

        super(StickbreakingCorrelatedLDA, self).__init__(data, T, alpha_beta)
Exemple #7
0
def test_correlated_pgm_rvs(Sigma):
    K = Sigma.shape[0] + 1
    mu, _ = compute_uniform_mean_psi(K)
    print("mu:  ", mu)

    # Sample a bunch of pis and look at the marginals
    samples = 10000
    psis = np.random.multivariate_normal(mu, Sigma, size=samples)
    pis = []
    for smpl in xrange(samples):
        pis.append(psi_to_pi(psis[smpl]))
    pis = np.array(pis)

    print("E[pi]:   ", pis.mean(axis=0))
    print("var[pi]: ", pis.var(axis=0))

    plt.figure()
    plt.subplot(311)
    plt.boxplot(pis)
    plt.xlabel("k")
    plt.ylabel("$p(\pi_k)$")

    # Plot the covariance
    cov = np.cov(pis.T)
    plt.subplot(323)
    plt.imshow(cov[:-1,:-1], interpolation="None", cmap="cool")
    plt.colorbar()
    plt.title("Cov($\pi$)")

    plt.subplot(324)
    invcov = np.linalg.inv(cov[:-1,:-1] + np.diag(1e-6 * np.ones(K-1)))
    # good = np.delete(np.arange(K), np.arange(0,K,3))
    # invcov = np.linalg.inv(cov[np.ix_(good,good)])
    plt.imshow(invcov, interpolation="None", cmap="cool")
    plt.colorbar()
    plt.title("Cov$(\pi)^{-1}$")

    plt.subplot(325)
    plt.imshow(Sigma, interpolation="None", cmap="cool")
    plt.colorbar()
    plt.title("$\Sigma$")

    plt.subplot(326)
    plt.imshow(np.linalg.inv(Sigma), interpolation="None", cmap="cool")
    plt.colorbar()
    plt.title("$\Sigma^{-1}$")


    plt.savefig("correlated_psi_pi.png")
    plt.show()
Exemple #8
0
def test_correlated_pgm_rvs(Sigma):
    K = Sigma.shape[0] + 1
    mu, _ = compute_uniform_mean_psi(K)
    print("mu:  ", mu)

    # Sample a bunch of pis and look at the marginals
    samples = 10000
    psis = np.random.multivariate_normal(mu, Sigma, size=samples)
    pis = []
    for smpl in range(samples):
        pis.append(psi_to_pi(psis[smpl]))
    pis = np.array(pis)

    print("E[pi]:   ", pis.mean(axis=0))
    print("var[pi]: ", pis.var(axis=0))

    plt.figure()
    plt.subplot(311)
    plt.boxplot(pis)
    plt.xlabel("k")
    plt.ylabel("$p(\pi_k)$")

    # Plot the covariance
    cov = np.cov(pis.T)
    plt.subplot(323)
    plt.imshow(cov[:-1, :-1], interpolation="None", cmap="cool")
    plt.colorbar()
    plt.title("Cov($\pi$)")

    plt.subplot(324)
    invcov = np.linalg.inv(cov[:-1, :-1] + np.diag(1e-6 * np.ones(K - 1)))
    # good = np.delete(np.arange(K), np.arange(0,K,3))
    # invcov = np.linalg.inv(cov[np.ix_(good,good)])
    plt.imshow(invcov, interpolation="None", cmap="cool")
    plt.colorbar()
    plt.title("Cov$(\pi)^{-1}$")

    plt.subplot(325)
    plt.imshow(Sigma, interpolation="None", cmap="cool")
    plt.colorbar()
    plt.title("$\Sigma$")

    plt.subplot(326)
    plt.imshow(np.linalg.inv(Sigma), interpolation="None", cmap="cool")
    plt.colorbar()
    plt.title("$\Sigma^{-1}$")

    plt.savefig("correlated_psi_pi.png")
    plt.show()
Exemple #9
0
def test_pgm_rvs():
    K = 10
    mu, sig = compute_uniform_mean_psi(K, sigma=2)
    # mu = np.zeros(K-1)
    # sig = np.ones(K-1)
    print("mu:  ", mu)
    print("sig: ", sig)

    Sigma = np.diag(sig)

    # Add some covariance
    # Sigma[:5,:5] = 1.0 + 1e-3*np.random.randn(5,5)

    # Sample a bunch of pis and look at the marginals
    pgm = PGMultinomial(K, mu=mu, Sigma=Sigma)
    samples = 10000
    pis = []
    for smpl in xrange(samples):
        pgm.resample()
        pis.append(pgm.pi)
    pis = np.array(pis)

    print("E[pi]:   ", pis.mean(axis=0))
    print("var[pi]: ", pis.var(axis=0))

    plt.figure()
    plt.subplot(121)
    plt.boxplot(pis)
    plt.xlabel("k")
    plt.ylabel("$p(\pi_k)$")

    # Plot the covariance
    cov = np.cov(pis.T)
    plt.subplot(122)
    plt.imshow(cov, interpolation="None", cmap="cool")
    plt.colorbar()
    plt.title("Cov($\pi$)")
    plt.show()
Exemple #10
0
def test_pgm_rvs():
    K = 10
    mu, sig = compute_uniform_mean_psi(K, sigma=2)
    # mu = np.zeros(K-1)
    # sig = np.ones(K-1)
    print("mu:  ", mu)
    print("sig: ", sig)

    Sigma = np.diag(sig)

    # Add some covariance
    # Sigma[:5,:5] = 1.0 + 1e-3*np.random.randn(5,5)

    # Sample a bunch of pis and look at the marginals
    pgm = PGMultinomial(K, mu=mu, Sigma=Sigma)
    samples = 10000
    pis = []
    for smpl in range(samples):
        pgm.resample()
        pis.append(pgm.pi)
    pis = np.array(pis)

    print("E[pi]:   ", pis.mean(axis=0))
    print("var[pi]: ", pis.var(axis=0))

    plt.figure()
    plt.subplot(121)
    plt.boxplot(pis)
    plt.xlabel("k")
    plt.ylabel("$p(\pi_k)$")

    # Plot the covariance
    cov = np.cov(pis.T)
    plt.subplot(122)
    plt.imshow(cov, interpolation="None", cmap="cool")
    plt.colorbar()
    plt.title("Cov($\pi$)")
    plt.show()
Exemple #11
0
    def __init__(self, K, kernel, D, Z=None, X=None, mu=None, mu_0=None, Sigma_0=None):
        self.K = K
        self.D = D
        self.kernel = kernel

        # Start with an empty datalist
        self.data_list = []

        # Initialize the GP mean prior
        if not any([_ is None for _ in (mu_0, Sigma_0)]):
            assert mu_0.shape == (self.K-1,)
            assert Sigma_0.shape == (self.K-1, self.K-1)
            self.mu_0, self.Sigma_0 = mu_0, Sigma_0
        else:
            self.mu_0 = compute_uniform_mean_psi(K)[0]
            self.Sigma_0 = np.eye(self.K-1)

        # Initialize the GP mean
        if mu is None:
            self.mu = self.mu_0.copy()
        else:
            assert isinstance(mu, np.ndarray) and mu.shape == (self.K-1,)
            self.mu = mu
Exemple #12
0
        betas.append(model.beta.copy())

    # Check that the PG-Multinomial samples are distributed like the prior
    thetas = np.array(thetas)
    theta_mean = thetas.mean(0)
    theta_std  = thetas.std(0)

    betas = np.array(betas)
    beta_mean = betas.mean(0)
    beta_std  = betas.std(0)

    # Now sample from the prior for comparison
    print("Sampling from prior")
    from pybasicbayes.distributions import GaussianFixedMean
    from pgmult.utils import compute_uniform_mean_psi, psi_to_pi
    mu, sigma0 = compute_uniform_mean_psi(T)
    psis_prior = np.array(
        [GaussianFixedMean(mu=mu, lmbda_0=T * sigma0, nu_0=T).rvs(1)
         for _ in range(N_iter)])
    thetas_prior = psi_to_pi(psis_prior[:,0,:])
    betas_prior = np.random.dirichlet(alpha_beta*np.ones(V), size=(N_iter,))

    # print "Mean psi: ", psi_mean, " +- ", psi_std

    import pybasicbayes.util.general as general
    percentilecutoff = 5
    def plot_1d_scaled_quantiles(p1,p2,plot_midline=True):
        # scaled quantiles so that multiple calls line up
        p1.sort(), p2.sort() # NOTE: destructive! but that's cool
        xmin,xmax = general.scoreatpercentile(p1,percentilecutoff), \
                    general.scoreatpercentile(p1,100-percentilecutoff)
Exemple #13
0
        betas.append(model.beta.copy())

    # Check that the PG-Multinomial samples are distributed like the prior
    thetas = np.array(thetas)
    theta_mean = thetas.mean(0)
    theta_std  = thetas.std(0)

    betas = np.array(betas)
    beta_mean = betas.mean(0)
    beta_std  = betas.std(0)

    # Now sample from the prior for comparison
    print("Sampling from prior")
    from pybasicbayes.distributions import GaussianFixedMean
    from pgmult.utils import compute_uniform_mean_psi, psi_to_pi
    mu, sigma0 = compute_uniform_mean_psi(T)
    psis_prior = np.array(
        [GaussianFixedMean(mu=mu, lmbda_0=T * sigma0, nu_0=T).rvs(1)
         for _ in xrange(N_iter)])
    thetas_prior = psi_to_pi(psis_prior[:,0,:])
    betas_prior = np.random.dirichlet(alpha_beta*np.ones(V), size=(N_iter,))

    # print "Mean psi: ", psi_mean, " +- ", psi_std

    import pybasicbayes.util.general as general
    percentilecutoff = 5
    def plot_1d_scaled_quantiles(p1,p2,plot_midline=True):
        # scaled quantiles so that multiple calls line up
        p1.sort(), p2.sort() # NOTE: destructive! but that's cool
        xmin,xmax = general.scoreatpercentile(p1,percentilecutoff), \
                    general.scoreatpercentile(p1,100-percentilecutoff)