def _partial_inference_z_update(self, theta_avg, doc_y_i, docToken, phi_avg): doc_z_unnorm_log = np.dot( np.log(phi_avg[:, docToken]), doc_y_i ) doc_z_unnorm_log += np.log(theta_avg) return probNormalizeLog(doc_z_unnorm_log)
def _prob_doc_z(self, TE_no_d_z, Y1TV_no_d_z, TI_no_d_z, docE, docW, doc_Y1V): """ calculate conditional probability for document-level topic doc_z method is different from [1] :param TE_no_d_z: TE without doc d :param Y1TV_no_d_z: Y1TV without d :param TI_no_d_z: TI without d :param docE: document-level emotion counts [self.E], np.sum(docE) == Md :param docW: document-level words counts [self.V], np.sum(docW) == Nd :return: doc_z """ # alpha # log_prob_a = np.log(TI_no_d_z + self.alpha) # TE # a = TE_no_d_z + self.gamma log_prob_b = np.sum(logfactorial(docE, a), axis=1) - logfactorial( np.sum(docE), np.sum(a, axis=1)) # Y1TV # b = Y1TV_no_d_z + self.beta log_prob_c = np.sum(logfactorialSparse( doc_Y1V, b), axis=1) - logfactorial(doc_Y1V.sum(), np.sum(b, axis=1)) prob_doc_z = probNormalizeLog(log_prob_a + log_prob_b + log_prob_c) return prob_doc_z
def _fit_single_document_x_update(doc_z2, doc_r, doc_u, doc_e, pars_topass): doc_x_unnorm_log_u = pars_topass["psi"].bigamma_data[doc_u] doc_x_unnorm_log_e = np.expand_dims(doc_r[:, 2], axis=-1) * np.transpose( np.tensordot( doc_z2, pars_topass["eta"].bigamma_data, axes=(0, 0) ), axes=(1, 0) )[doc_e, :] doc_x_unnorm_log = doc_x_unnorm_log_u + doc_x_unnorm_log_e return probNormalizeLog(doc_x_unnorm_log)
def _fit_single_document_z1_update(doc_y, doc_r, docToken, doc_e, pars_topass): doc_z1_unnorm_log_w = np.dot( pars_topass["phi1"].bigamma_data[:, docToken], doc_y[:, 0] ) doc_z1_unnorm_log_e = np.tensordot( doc_r[:, 1], pars_topass["eta_z"].bigamma_data[:, doc_e], axes=[0, -1] ) doc_z1_unnorm_log_theta1 = pars_topass["theta1"].bigamma_data doc_z1_unnorm_log = doc_z1_unnorm_log_w + doc_z1_unnorm_log_e + doc_z1_unnorm_log_theta1 return probNormalizeLog(doc_z1_unnorm_log)
def _fit_single_document_z2_update(doc_x, doc_y, doc_r, docToken, doc_e, pars_topass): doc_z2_unnorm_log_w = np.dot( pars_topass["phi2"].bigamma_data[:, docToken], doc_y[:, 1] ) doc_z2_unnorm_log_e = np.tensordot( pars_topass["eta"].bigamma_data[:, :, doc_e] * doc_r[:, 2], doc_x, axes=([2, 1], [0, 1]) ) doc_z2_unnorm_log_theta2 = pars_topass["theta2"].bigamma_data doc_z2_unnorm_log = doc_z2_unnorm_log_w + doc_z2_unnorm_log_e + doc_z2_unnorm_log_theta2 return probNormalizeLog(doc_z2_unnorm_log)
def _fit_single_document_r_update(doc_z2, doc_z1, doc_x, doc_u, doc_e, pars_topass): Md = doc_u.shape[0] doc_r_unnorm_log = np.zeros([Md, 3]) doc_r_unnorm_log[:, 0] = pars_topass["eta_u"].bigamma_data[doc_u, doc_e] doc_r_unnorm_log[:, 1] = np.dot(doc_z1, pars_topass["eta_z"].bigamma_data[:, doc_e]) doc_r_unnorm_log[:, 2] = np.tensordot( doc_x, np.tensordot( doc_z2, pars_topass["eta"].bigamma_data, axes=(0, 0) ), axes=(1, 0) )[np.arange(Md), doc_e] doc_r_unnorm_log += pars_topass["se"].bigamma_data return probNormalizeLog(doc_r_unnorm_log)
def _prob_doc_z(self, TI_no_d, TXE_no_d, Y1TV_no_d, doc_XE, doc_Y1V): """ calculate conditional probability for document-level topic doc_z :param: doc_Y1V: lil_matrix((1, self.V), dtype=int8) """ # alpha # log_prob_alpha = np.log(TI_no_d + self.alpha) # gamma # (without sparsity, directly calculating log gamma function) a = TXE_no_d + self.gamma + doc_XE log_prob_gamma = np.sum(np.sum(gammaln(a), axis=-1) - gammaln(np.sum(a, axis=-1)), axis=-1) # beta # (with sparsity) b = Y1TV_no_d + self.beta log_prob_beta = np.sum(logfactorialSparse(doc_Y1V, b), axis=-1) - logfactorial(doc_Y1V.sum(), np.sum(b, axis=-1)) prob_doc_z = probNormalizeLog(log_prob_alpha + log_prob_gamma + log_prob_beta) return prob_doc_z
def _fit_single_document_y_update(doc_z2, doc_z1, docToken, pars_topass): doc_y_unnorm_log = np.zeros([docToken.shape[0], 2]) doc_y_unnorm_log[:, 0] = np.dot(doc_z1, pars_topass["phi1"].bigamma_data[:, docToken]) doc_y_unnorm_log[:, 1] = np.dot(doc_z2, pars_topass["phi2"].bigamma_data[:, docToken]) doc_y_unnorm_log += pars_topass["pi"].bigamma_data return probNormalizeLog(doc_y_unnorm_log)
def _partial_inference_y_update(self, doc_z2, doc_z1, pi_avg, phi2_avg, phi1_avg, docToken): doc_y_unnorm_log = np.zeros([docToken.shape[0], 2]) doc_y_unnorm_log[:, 0] = np.dot(doc_z1, np.log(phi1_avg[:, docToken])) doc_y_unnorm_log[:, 1] = np.dot(doc_z2, np.log(phi2_avg[:, docToken])) doc_y_unnorm_log += np.log(pi_avg) return probNormalizeLog(doc_y_unnorm_log)