use_gpu = int(options.gpu) verbosity = int(options.verbose) N = int(1e5) # n data points per component K = 2 # ndim ncomps = 3 # n mixture components npr.seed(datetime.now().microsecond) true_labels, data = generate_data(n=N, k=K, ncomps=ncomps) data = data - data.mean(0) data = data / data.std(0) #import pdb #pdb.set_trace() print "use_gpu=" + str(use_gpu) mcmc = DPNormalMixture(data, ncomp=3, gpu=use_gpu, verbose=verbosity, parallel=options.parallel) #, mu0=mu0) mcmc.sample(200, nburn=0) print mcmc.mu[-1] bem = BEM_DPNormalMixture(mcmc, verbose=verbosity) bem.optimize(maxiter=5) print bem.mu ident_mcmc = DPNormalMixture(bem, verbose=verbosity) ident_mcmc.sample(100, nburn=0, ident=True) print ident_mcmc.weights[-1] print ident_mcmc.mu[-1]
def _fit(self, fcmdata, verbose=False): """ fit the mixture model to the data use get_results() to get the fitted model """ pnts = fcmdata.view().copy() self.m = pnts.mean(0) self.s = pnts.std(0) self.data = (pnts - self.m) / self.s if len(self.data.shape) == 1: self.data = self.data.reshape((self.data.shape[0], 1)) if len(self.data.shape) != 2: raise ValueError("pnts is the wrong shape") self.n, self.d = self.data.shape if self._ref is not None: self.ident = True self._load_ref_at_fit(pnts) if self.prior_mu is not None: self._load_mu_at_fit() if self.prior_sigma is not None: self._load_sigma_at_fit() if self.seed is not None: seed(self.seed) else: from datetime import datetime seed(datetime.now().microsecond) #TODO move hyperparameter settings here if self.type.lower() == 'bem': self.cdp = BEM_DPNormalMixture(self.data, ncomp=self.nclusts, gamma0=self.gamma0, m0=self.m0, nu0=self.nu0, Phi0=self.Phi0, e0=self.e0, f0=self.f0, mu0=self._prior_mu, Sigma0=self._prior_sigma, weights0=self._prior_pi, alpha0=self.alpha0, gpu=self.device, parallel=self.parallel, verbose=verbose) self.cdp.optimize(self.niter) else: self.cdp = DPNormalMixture(self.data, ncomp=self.nclusts, gamma0=self.gamma0, m0=self.m0, nu0=self.nu0, Phi0=self.Phi0, e0=self.e0, f0=self.f0, mu0=self._prior_mu, Sigma0=self._prior_sigma, weights0=self._prior_pi, alpha0=self.alpha0, gpu=self.device, parallel=self.parallel, verbose=verbose) self.cdp.sample(niter=self.niter, nburn=self.burnin, thin=1, ident=self.ident) if self.last is None: self.last = self.niter self._run = True #we've fit the mixture model return self.get_results()