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) from cornac.models.pmf import pmf if self.trainable: # converting data to the triplet format (needed for cython function pmf) (uid, iid, rat) = train_set.uir_tuple rat = np.array(rat, dtype='float32') if self.variant == 'non_linear': # need to map the ratings to [0,1] if [self.train_set.min_rating, self.train_set.max_rating] != [0, 1]: rat = scale(rat, 0., 1., self.train_set.min_rating, self.train_set.max_rating) uid = np.array(uid, dtype='int32') iid = np.array(iid, dtype='int32') if self.verbose: print('Learning...') if self.variant == 'linear': res = pmf.pmf_linear(uid, iid, rat, k=self.k, n_users=train_set.num_users, n_items=train_set.num_items, n_ratings=len(rat), 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) elif self.variant == 'non_linear': res = pmf.pmf_non_linear(uid, iid, rat, k=self.k, n_users=train_set.num_users, n_items=train_set.num_items, n_ratings=len(rat), 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) else: raise ValueError('variant must be one of {"linear","non_linear"}') self.U = np.asarray(res['U']) self.V = np.asarray(res['V']) 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. """ from cornac.models.pmf import pmf Recommender.fit(self, train_set) if self.trainable: # converting data to the triplet format (needed for cython function pmf) (uid, iid, rat) = train_set.uir_tuple rat = np.array(rat, dtype='float32') if self.variant == 'non_linear': # need to map the ratings to [0,1] if [self.train_set.min_rating, self.train_set.max_rating ] != [0, 1]: rat = scale(rat, 0., 1., self.train_set.min_rating, self.train_set.max_rating) uid = np.array(uid, dtype='int32') iid = np.array(iid, dtype='int32') if self.verbose: print('Learning...') if self.variant == 'linear': res = pmf.pmf_linear(uid, iid, rat, k=self.k, n_users=train_set.num_users, n_items=train_set.num_items, n_ratings=len(rat), 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) elif self.variant == 'non_linear': res = pmf.pmf_non_linear(uid, iid, rat, k=self.k, n_users=train_set.num_users, n_items=train_set.num_items, n_ratings=len(rat), 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) else: raise ValueError( 'variant must be one of {"linear","non_linear"}') self.U = np.asarray(res['U']) self.V = np.asarray(res['V']) if self.verbose: print('Learning completed') elif self.verbose: print('%s is trained already (trainable = False)' % (self.name))