def ve_step(self, mu, sigma, alpha=1., beta=0.0): """ VE-step """ # Copy beta parameter self.beta = beta # Compute complete-data likelihood maps, replacing very small # values for numerical stability for i in range(self.ntissues): self.ref_[:,i] = self.prior_[:,i]**alpha self.ref_[:,i] *= self.dist(self.data_, mu[i], sigma[i]) self.ref_[:] = np.maximum(self.ref_, TINY) # Normalize reference probability map if beta == 0.0: self.ppm[self.mask] = (self.ref_.T/self.ref_.sum(1)).T # Update and normalize reference probabibility map using # neighborhood information (mean-field theory) else: print(' ... MRF correction') # Deal with mixing matrix and label switching mixmat = self.mixmat if not mixmat == None: mixmat = self.sort_mixmat(mu) self.ppm = _ve_step(self.ppm, self.ref_, np.array(self.mask, dtype='int'), beta, self.copy, self.hard, mixmat)
def ve_step(self, mu, sigma, alpha=1., beta=0.0): """ VE-step """ for i in range(self.ntissues): self.ref_[:,i] = self.prior_[:,i]**alpha self.ref_[:,i] *= self.dist(self.data_, mu[i], sigma[i]) # Replace very small values for numerical stability self.ref_[:] = np.maximum(self.ref_, TINY) # Normalize reference probability map if beta == 0.0: self.ppm[self.mask] = (self.ref_.T/self.ref_.sum(1)).T # Update and normalize reference probabibility map using # neighborhood information (mean-field theory) else: print(' ... MRF correction') self.ppm = _ve_step(self.ppm, self.ref_, np.array(self.mask, dtype='int'), beta, self.copy, self.hard)