Пример #1
0
def _update_beta_local(model, data):

    ##
    counts_norm, nreplicas = data
    counts_norm = np.hstack(counts_norm)

    ##
    beta_ = np.r_[0, model.beta[1:] * np.exp(0.01 * rn.randn(model.lw.size-1))]

    ##
    beta1 = np.repeat(model.beta[model.z.T], nreplicas, axis=1)
    beta2 = np.repeat(beta_[model.z.T], nreplicas, axis=1)
    loglik = _compute_loglik(counts_norm, model.log_phi.reshape(-1, 1), model.log_mu.reshape(-1, 1), beta1)
    loglik_ = _compute_loglik(counts_norm, model.log_phi.reshape(-1, 1), model.log_mu.reshape(-1, 1), beta2)

    z = np.repeat(model.z.T, nreplicas, axis=1)
    loglik = np.bincount(z.ravel(), loglik.ravel(), minlength=model.lw.size)
    loglik_ = np.bincount(z.ravel(), loglik_.ravel(), minlength=model.lw.size)

    logprior = st.normalln(model.beta, model.m0, 1/model.t0)
    logprior_ = st.normalln(beta_, model.m0, 1/model.t0)

    logpost = loglik + logprior
    logpost_ = loglik_ + logprior_

    ##
    idxs = (logpost_ >= logpost) | (rn.rand(model.lw.size) < np.exp(logpost_ - logpost))
    model.beta[model.iact & idxs] = beta_[model.iact & idxs]

    ##
    model.beta[~model.iact] = rn.normal(model.m0, 1/np.sqrt(model.t0), model.lw.size-model.nact)
Пример #2
0
def _update_phi_local(model, data):

    ##
    counts_norm, nreplicas = data
    counts_norm = np.hstack(counts_norm)

    ## proposal
    log_phi_ = model.log_phi * np.exp(0.01 * rn.randn(model.nfeatures))

    ## log-likelihood
    beta = np.repeat(model.beta[model.z.T], nreplicas, axis=1)
    loglik = _compute_loglik(counts_norm, model.log_phi.reshape(-1, 1), model.log_mu.reshape(-1, 1), beta).sum(-1)
    loglik_ = _compute_loglik(counts_norm, log_phi_.reshape(-1, 1), model.log_mu.reshape(-1, 1), beta).sum(-1)

    ## log-prior
    logprior = st.normalln(model.log_phi, model.mu, 1 / model.tau)
    logprior_ = st.normalln(log_phi_, model.mu, 1 / model.tau)

    ## log-posterior
    logpost = loglik + logprior
    logpost_ = loglik_ + logprior_

    ## update
    idxs = (logpost_ >= logpost) | (rn.rand(model.nfeatures) < np.exp(logpost_ - logpost))
    model.log_phi[idxs] = log_phi_[idxs]
Пример #3
0
def _update_beta_local(model, data):

    ##
    counts_norm, nreplicas = data
    counts_norm = np.hstack(counts_norm)

    ##
    beta_ = np.r_[0, model.beta[1:] * np.exp(0.01 * rn.randn(model.lw.size-1))]

    ##
    beta1 = np.repeat(model.beta[model.z.T], nreplicas, axis=1)
    beta2 = np.repeat(beta_[model.z.T], nreplicas, axis=1)
    loglik = _compute_loglik(counts_norm, model.log_phi.reshape(-1, 1), model.log_mu.reshape(-1, 1), beta1)
    loglik_ = _compute_loglik(counts_norm, model.log_phi.reshape(-1, 1), model.log_mu.reshape(-1, 1), beta2)

    z = np.repeat(model.z.T, nreplicas, axis=1)
    loglik = np.bincount(z.ravel(), loglik.ravel(), minlength=model.lw.size)
    loglik_ = np.bincount(z.ravel(), loglik_.ravel(), minlength=model.lw.size)

    logprior = st.normalln(model.beta, model.m0, 1/model.t0)
    logprior_ = st.normalln(beta_, model.m0, 1/model.t0)

    logpost = loglik + logprior
    logpost_ = loglik_ + logprior_

    ##
    idxs = np.log(rn.rand(model.lw.size)) < logpost_ - logpost
    model.beta[model.iact & idxs] = beta_[model.iact & idxs]

    ##
    model.beta[~model.iact] = rn.normal(model.m0, 1/np.sqrt(model.t0), model.lw.size-model.nact)
Пример #4
0
    def plot_clusters(self, fig=None, npoints=100):
        """Plot LFC clusters"""

        ## data
        beta = self.beta[self.iact]
        occ = self.occ[self.iact]
        x = np.linspace(beta.min()-1, beta.max()+1, npoints)
        y = np.exp(st.normalln(x, self.m0, 1 / np.sqrt(self.t0)))

        ## plot
        fig = pl.figure() if fig is None else fig
        pl.figure(fig.number)

        pl.plot(x, y)
        pl.axvline(0, linestyle='--', color='k')
        pl.vlines(beta[1:], [0], occ[1:] / occ[1:].sum(), color='r')

        pl.grid()
        pl.xlabel('LFC')
        pl.ylabel('density')
        pl.legend(['LFC prior', 'null cluster', 'non-null clusters'], loc=0)

        pl.tight_layout()
Пример #5
0
    def plot_clusters(self, fig=None, npoints=100):
        """Plot LFC clusters"""

        # data
        beta = self.beta[self.iact]
        occ = self.occ[self.iact]
        x = np.linspace(beta.min()-1, beta.max()+1, npoints)
        y = np.exp(st.normalln(x, self.m0, 1 / np.sqrt(self.t0)))

        # plot
        fig = pl.figure() if fig is None else fig
        pl.figure(fig.number)

        pl.plot(x, y)
        pl.axvline(0, linestyle='--', color='k')
        pl.vlines(beta[1:], [0], occ[1:] / occ[1:].sum(), color='r')

        pl.grid()
        pl.xlabel('LFC')
        pl.ylabel('density')
        pl.legend(['LFC prior', 'null cluster', 'non-null clusters'], loc=0)

        pl.tight_layout()