def score(self, X, mask): from scipy.stats import norm, multivariate_normal, gamma if not hasattr(self, 'n_relations'): self.n_entities, self.n_relations, _ = X.shape score = 0. p = self.p_weights.argmax() for k in range(self.n_relations): mean = np.dot(np.dot(self.E[p], self.R[p][k]), self.E[p].T) score += np.sum(norm.logpdf(X[k].flatten(), mean.flatten(), np.sqrt(self.var_x)) * mask[k].flatten()) score += np.sum(norm.logpdf(self.R[p][k].flatten(), 0, np.sqrt(self.var_r[p]))) for i in range(self.n_entities): score += multivariate_normal.logpdf(self.E[p][i], np.zeros(self.n_dim), np.identity(self.n_dim) * self.var_e[p]) if self.sample_prior: score += gamma.logpdf(self.var_e[p], loc=self.e_alpha, shape=self.e_beta) score += gamma.logpdf(self.var_r[p], loc=self.r_alpha, shape=self.r_beta) return score
def score(self, X): from scipy.stats import norm, multivariate_normal if not hasattr(self, 'n_relations'): self.n_entities, self.n_relations, _ = X.shape score = 0 for k in range(self.n_relations): mean = np.dot(np.dot(self.E, self.R[k]), self.E.T) if self.controlled_var: score += np.sum(norm.logpdf(X[k].flatten(), mean.flatten(), np.sqrt(self.var_X[k].flatten()))) else: score += np.sum(norm.logpdf(X[k].flatten(), mean.flatten(), np.sqrt(self.var_x))) score += np.sum(norm.logpdf(self.R[k].flatten(), 0, np.sqrt(self.var_r))) for i in range(self.n_entities): score += multivariate_normal.logpdf(self.E[i], np.zeros(self.n_dim), np.identity(self.n_dim) * self.var_e) if self.sample_prior: score += (self.e_alpha - 1.) * np.log(self.var_e) - self.e_beta * self.var_e score += (self.r_alpha - 1.) * np.log(self.var_r) - self.r_beta * self.var_r return score