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)
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]
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)
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()
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()