コード例 #1
0
ファイル: recom_sorec.py プロジェクト: thalesfsp/cornac
    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
コード例 #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
        """
        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
コード例 #3
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.
        """
        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)