def fit(self, train_set, val_set=None): """Fit the model to observations. Parameters ---------- train_set: :obj:`cornac.data.Dataset`, required User-Item preference data as well as additional modalities. val_set: :obj:`cornac.data.Dataset`, optional, default: None User-Item preference data for model selection purposes (e.g., early stopping). Returns ------- self : object """ Recommender.fit(self, train_set, val_set) import math from cornac.models.sorec import sorec if self.trainable: # user-item interactions (rat_uid, rat_iid, rat_val) = train_set.uir_tuple # user-user social network map_uid = train_set.uid_list social_net = train_set.user_graph.get_train_triplet( map_uid, map_uid) social_raw = scipy.sparse.csc_matrix( (social_net[:, 2], (social_net[:, 0], social_net[:, 1])), shape=(len(map_uid), len(map_uid))) outdegree = np.array(social_raw.sum(axis=1)).flatten() indegree = np.array(social_raw.sum(axis=0)).flatten() weighted_social = [] for ui, uk, cik in social_net: i_out = outdegree[int(ui)] k_in = indegree[int(uk)] cik_weighted = math.sqrt(k_in / (k_in + i_out)) * cik weighted_social.append(cik_weighted) (net_uid, net_jid, net_val) = (social_net[:, 0], social_net[:, 1], weighted_social) if [self.train_set.min_rating, self.train_set.max_rating ] != [0, 1]: if self.train_set.min_rating == self.train_set.max_rating: rat_val = scale(rat_val, 0., 1., 0., self.train_set.max_rating) else: rat_val = scale(rat_val, 0., 1., self.train_set.min_rating, self.train_set.max_rating) rat_val = np.array(rat_val, dtype='float32') rat_uid = np.array(rat_uid, dtype='int32') rat_iid = np.array(rat_iid, dtype='int32') net_val = np.array(net_val, dtype='float32') net_uid = np.array(net_uid, dtype='int32') net_jid = np.array(net_jid, dtype='int32') if self.verbose: print('Learning...') res = sorec.sorec(rat_uid, rat_iid, rat_val, net_uid, net_jid, net_val, k=self.k, n_users=train_set.num_users, n_items=train_set.num_items, n_ratings=len(rat_val), n_edges=len(net_val), n_epochs=self.max_iter, lamda_c=self.lamda_c, lamda=self.lamda, learning_rate=self.learning_rate, gamma=self.gamma, init_params=self.init_params, verbose=self.verbose) self.U = np.asarray(res['U']) self.V = np.asarray(res['V']) self.Z = np.asarray(res['Z']) if self.verbose: print('Learning completed') elif self.verbose: print('%s is trained already (trainable = False)' % self.name) return self
def fit(self, train_set, val_set=None): """Fit the model to observations. Parameters ---------- train_set: :obj:`cornac.data.Dataset`, required User-Item preference data as well as additional modalities. val_set: :obj:`cornac.data.Dataset`, optional, default: None User-Item preference data for model selection purposes (e.g., early stopping). Returns ------- self : object """ Recommender.fit(self, train_set, val_set) import math from cornac.models.sorec import sorec if self.trainable: # user-item interactions (rat_uid, rat_iid, rat_val) = train_set.uir_tuple # user social network map_uid = train_set.user_indices (net_uid, net_jid, net_val) = train_set.user_graph.get_train_triplet( map_uid, map_uid ) if self.weight_link: degree = train_set.user_graph.get_node_degree(map_uid, map_uid) weighted_net_val = [] for u, j, val in zip(net_uid, net_jid, net_val): u_out = degree[int(u)][1] j_in = degree[int(j)][0] val_weighted = math.sqrt(j_in / (j_in + u_out)) * val weighted_net_val.append(val_weighted) net_val = weighted_net_val if [self.train_set.min_rating, self.train_set.max_rating] != [0, 1]: if self.train_set.min_rating == self.train_set.max_rating: rat_val = scale(rat_val, 0.0, 1.0, 0.0, self.train_set.max_rating) else: rat_val = scale( rat_val, 0.0, 1.0, self.train_set.min_rating, self.train_set.max_rating, ) rat_val = np.array(rat_val, dtype="float32") rat_uid = np.array(rat_uid, dtype="int32") rat_iid = np.array(rat_iid, dtype="int32") net_val = np.array(net_val, dtype="float32") net_uid = np.array(net_uid, dtype="int32") net_jid = np.array(net_jid, dtype="int32") if self.verbose: print("Learning...") res = sorec.sorec( rat_uid, rat_iid, rat_val, net_uid, net_jid, net_val, k=self.k, n_users=train_set.num_users, n_items=train_set.num_items, n_ratings=len(rat_val), n_edges=len(net_val), n_epochs=self.max_iter, lamda_c=self.lamda_c, lamda=self.lamda, learning_rate=self.learning_rate, gamma=self.gamma, init_params={"U": self.U, "V": self.V, "Z": self.Z}, verbose=self.verbose, seed=self.seed, ) self.U = np.asarray(res["U"]) self.V = np.asarray(res["V"]) self.Z = np.asarray(res["Z"]) if self.verbose: print("Learning completed") elif self.verbose: print("%s is trained already (trainable = False)" % self.name) return self
def fit(self, train_set): """Fit the model to observations. Parameters ---------- train_set: object of type TrainSet, required An object contraining the user-item preference in csr scipy sparse format,\ as well as some useful attributes such as mappings to the original user/item ids.\ Please refer to the class TrainSet in the "data" module for details. """ import math from cornac.models.sorec import sorec Recommender.fit(self, train_set) if self.trainable: # user-item interactions (rat_uid, rat_iid, rat_val) = train_set.uir_tuple # user-user social network map_uid = train_set.uid_list social_net = train_set.user_graph.get_train_triplet( map_uid, map_uid) social_raw = scipy.sparse.csc_matrix( (social_net[:, 2], (social_net[:, 0], social_net[:, 1])), shape=(len(map_uid), len(map_uid))) outdegree = np.array(social_raw.sum(axis=1)).flatten() indegree = np.array(social_raw.sum(axis=0)).flatten() weighted_social = [] for ui, uk, cik in social_net: i_out = outdegree[int(ui)] k_in = indegree[int(uk)] cik_weighted = math.sqrt(k_in / (k_in + i_out)) * cik weighted_social.append(cik_weighted) (net_uid, net_jid, net_val) = (social_net[:, 0], social_net[:, 1], weighted_social) if [self.train_set.min_rating, self.train_set.max_rating ] != [0, 1]: if self.train_set.min_rating == self.train_set.max_rating: rat_val = scale(rat_val, 0., 1., 0., self.train_set.max_rating) else: rat_val = scale(rat_val, 0., 1., self.train_set.min_rating, self.train_set.max_rating) rat_val = np.array(rat_val, dtype='float32') rat_uid = np.array(rat_uid, dtype='int32') rat_iid = np.array(rat_iid, dtype='int32') net_val = np.array(net_val, dtype='float32') net_uid = np.array(net_uid, dtype='int32') net_jid = np.array(net_jid, dtype='int32') if self.verbose: print('Learning...') res = sorec.sorec(rat_uid, rat_iid, rat_val, net_uid, net_jid, net_val, k=self.k, n_users=train_set.num_users, n_items=train_set.num_items, n_ratings=len(rat_val), n_edges=len(net_val), n_epochs=self.max_iter, lamda_c=self.lamda_c, lamda=self.lamda, learning_rate=self.learning_rate, gamma=self.gamma, init_params=self.init_params, verbose=self.verbose) self.U = np.asarray(res['U']) self.V = np.asarray(res['V']) self.Z = np.asarray(res['Z']) if self.verbose: print('Learning completed') elif self.verbose: print('%s is trained already (trainable = False)' % self.name)