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. """ from cornac.models.mcf import mcf Recommender.fit(self, train_set) if self.trainable: # user-item interactions (rat_uid, rat_iid, rat_val) = train_set.uir_tuple # item-item affinity network map_iid = train_set.iid_list (net_iid, net_jid, net_val) = train_set.item_graph.get_train_triplet(map_iid, map_iid) 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) if [min(net_val), max(net_val)] != [0, 1]: if min(net_val) == max(net_val): net_val = scale(net_val, 0., 1., 0., max(net_val)) else: net_val = scale(net_val, 0., 1., min(net_val), max(net_val)) 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_iid = np.array(net_iid, dtype='int32') net_jid = np.array(net_jid, dtype='int32') if self.verbose: print('Learning...') res = mcf.mcf(rat_uid, rat_iid, rat_val, net_iid, 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=self.lamda, learning_rate=self.learning_rate, gamma=self.gamma, init_params=self.init_params, 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)
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 """ from cornac.models.mcf import mcf Recommender.fit(self, train_set, val_set) if self.trainable: # user-item interactions (rat_uid, rat_iid, rat_val) = train_set.uir_tuple # item-item affinity network map_iid = train_set.item_indices (net_iid, net_jid, net_val) = train_set.item_graph.get_train_triplet( map_iid, map_iid) 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) if [min(net_val), max(net_val)] != [0, 1]: if min(net_val) == max(net_val): net_val = scale(net_val, 0., 1., 0., max(net_val)) else: net_val = scale(net_val, 0., 1., min(net_val), max(net_val)) 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_iid = np.array(net_iid, dtype='int32') net_jid = np.array(net_jid, dtype='int32') if self.verbose: print('Learning...') res = mcf.mcf(rat_uid, rat_iid, rat_val, net_iid, 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=self.lamda, learning_rate=self.learning_rate, gamma=self.gamma, init_params=self.init_params, 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