Example #1
0
    def recommend(self, playlist_id, at=10):
        playlist_id = int(playlist_id)
        helper = Helper()

        ### DUE TO TIME CONSTRAINT THE CODE STRUCTURE HERE IS REDUNTANT
        ### TODO exploit inheritance to reduce code duplications and simple extract ratings, combine them, simply by iterate over a list of recommenders

        ### COMMON CODE ###
        self.hybrid_ratings = None  #BE CAREFUL, MAGIC INSIDE :)

        ### COMBINE RATINGS IN DIFFERENT WAYS (seq, random short, random long)
        if (helper.is_sequential(playlist_id)):
            self.userCF_ratings = self.userCF_sequential.get_expected_ratings(
                playlist_id)
            self.itemCF_ratings = self.itemCF_sequential.get_expected_ratings(
                playlist_id)
            self.cbf_ratings = self.cbf_sequential.get_expected_ratings(
                playlist_id)
            self.slim_elastic_ratings = self.slim_elastic_sequential.get_expected_ratings(
                playlist_id)
            # self.svd_icm_ratings = self.svd_icm_sequential.get_expected_ratings(playlist_id)
            self.ALS_ratings = self.ALS_sequential.get_expected_ratings(
                playlist_id)
            self.slim_ratings = self.slim_sequential.get_expected_ratings(
                playlist_id)
            w_right = self.w_seq
        else:
            self.userCF_ratings = self.userCF.get_expected_ratings(playlist_id)
            self.itemCF_ratings = self.itemCF.get_expected_ratings(playlist_id)
            self.cbf_ratings = self.cbf.get_expected_ratings(playlist_id)
            self.slim_elastic_ratings = self.slim_elastic.get_expected_ratings(
                playlist_id)
            # self.svd_icm_ratings = self.svd_icm.get_expected_ratings(playlist_id)
            self.ALS_ratings = self.ALS.get_expected_ratings(playlist_id)
            self.slim_ratings = self.slim_random.get_expected_ratings(
                playlist_id)
            if len(self.URM[playlist_id].indices) > 10:
                w_right = self.w_long
            else:
                w_right = self.w_short

        self.hybrid_ratings = self.userCF_ratings * w_right["user_cf"]
        self.hybrid_ratings += self.itemCF_ratings * w_right["item_cf"]
        self.hybrid_ratings += self.cbf_ratings * w_right["cbf"]
        self.hybrid_ratings += self.slim_ratings * w_right["slim"]
        # self.hybrid_ratings += self.svd_icm_ratings * w_right["svd_icm"]
        self.hybrid_ratings += self.ALS_ratings * w_right["als"]
        self.hybrid_ratings += self.slim_elastic_ratings * w_right["elastic"]

        recommended_items = np.flip(np.argsort(self.hybrid_ratings), 0)

        # REMOVING SEEN
        unseen_items_mask = np.in1d(recommended_items,
                                    self.URM[playlist_id].indices,
                                    assume_unique=True,
                                    invert=True)
        recommended_items = recommended_items[unseen_items_mask]

        return recommended_items[0:at]