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