示例#1
0
    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
示例#2
0
    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))