def EMiterate(self): """ Do one iteration :return: logL """ # Get params for current iteration data = self.s.getFeatures(self.label) nbSamples, nbFeatures = data.shape log_pXn_mat = np.zeros((nbSamples, self.K)) for i in range(self.K): tmp = GMM.logN(data, self.mean[i], self.cov[i]) log_pXn_mat[:, i] = tmp + np.log(self.w[i]) pMax = np.max(log_pXn_mat, axis=1) log_pXn = pMax + np.log(np.sum(np.exp(log_pXn_mat.T - pMax), axis=0).T) logL = np.sum(log_pXn) log_pNk = np.zeros((nbSamples, self.K)) for i in range(self.K): log_pNk[:, i] = log_pXn_mat[:, i] - log_pXn pNk = np.e**log_pNk for i in range(self.K): self.mean[i] = np.sum(pNk[:, i] * data.T, axis=1) / np.sum(pNk[:, i]) self.cov[i] = np.dot(pNk[:, i] * (data - self.mean[i]).T, data - self.mean[i]) / np.sum(pNk[:, i]) self.w[i] = np.sum(pNk[:, i]) / nbSamples return logL
def pdf(self, X): """ Evaluate the pdf of data to belong to the mixture :param data: (npArray) data to evaluate :return: proba (npArray) """ proba = None for i in range(self.K): w = self.w[i] probaToAdd = GMM.gaussianPdf(X, self.mean[i], self.cov[i]) * w if proba is None: proba = probaToAdd else: proba += probaToAdd return proba