def logprob_a(self, X, Xcov): """ Evaluate the probability for a set of points Parameters ---------- X: array_like Input data. shape = (n_samples, n_features) Xcov: array_like Covariance of input data. shape = (n_samples, n_features, n_features) Returns ------- p: ndarray Probabilities. shape = (n_samples,) """ X = np.asarray(X) Xcov = np.asarray(Xcov) n_samples, n_features = X.shape # assume full covariances of data assert Xcov.shape == (n_samples, n_features, n_features) X = X[:, np.newaxis, :] Xcov = Xcov[:, np.newaxis, :, :] T = Xcov + self.V if self.Nthreads == 1: return log_multivariate_gaussian(X, self.mu, T) else: return log_multivariate_gaussian_Nthreads(X, self.mu, T, self.Nthreads)
def _Estep((T, w_m, X, model, n_samples)): """ Compute the Estep for the given data chunk and current model """ # compute inverse of each covariance matrix T Tshape = T.shape T = T.reshape([n_samples * model.n_components, model.n_features, model.n_features]) Tinv = np.array([np.linalg.inv(T[i]) for i in range(T.shape[0])]).reshape(Tshape) T = T.reshape(Tshape) # evaluate each mixture at each point N = np.exp(log_multivariate_gaussian(X, model.mu, T, Vinv=Tinv)) # q q = (N * model.alpha) / np.dot(N, model.alpha)[:, None] # b tmp = np.sum(Tinv * w_m[:, :, np.newaxis, :], -1) b = model.mu + np.sum(model.V * tmp[:, :, np.newaxis, :], -1) # B tt = time() tmp = np.sum(Tinv[:, :, :, :, np.newaxis] * model.V[:, np.newaxis, :, :], -2) B = model.V - np.sum(model.V[:, :, :, np.newaxis] * tmp[:, :, np.newaxis, :, :], -2) return (q, b, B)
def _Estep((T, w_m, X, model, n_samples)): """ Compute the Estep for the given data chunk and current model """ # compute inverse of each covariance matrix T Tshape = T.shape T = T.reshape( [n_samples * model.n_components, model.n_features, model.n_features]) Tinv = np.array([np.linalg.inv(T[i]) for i in range(T.shape[0])]).reshape(Tshape) T = T.reshape(Tshape) # evaluate each mixture at each point N = np.exp(log_multivariate_gaussian(X, model.mu, T, Vinv=Tinv)) # q q = (N * model.alpha) / np.dot(N, model.alpha)[:, None] # b tmp = np.sum(Tinv * w_m[:, :, np.newaxis, :], -1) b = model.mu + np.sum(model.V * tmp[:, :, np.newaxis, :], -1) # B tt = time() tmp = np.sum(Tinv[:, :, :, :, np.newaxis] * model.V[:, np.newaxis, :, :], -2) B = model.V - np.sum( model.V[:, :, :, np.newaxis] * tmp[:, :, np.newaxis, :, :], -2) return (q, b, B)