'Estimate log probabilities and responsibilities for each sample.
Compute the log probabilities, weighted log probabilities per
component and responsibilities for each sample in X with respect to
the current state of the model.
Parameters
X : array-like, shape (n_samples, n_features)
Returns
log_prob_norm : array, shape (n_samples,)
log p(X)
log_responsibilities : array, shape (n_samples, n_components)
logarithm of the responsibilities'

def _estimate_log_prob_resp(self, X):

    weighted_log_prob = self._estimate_weighted_log_prob(X)
    log_prob_norm = logsumexp(weighted_log_prob, axis=1)
    with np.errstate(under='ignore'):
        log_resp = (weighted_log_prob - log_prob_norm[:, np.newaxis])
    return (log_prob_norm, log_resp)
