Example #1
0
    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
Example #2
0
    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