def trial_boost_user(data):
    rec1 = UserKNNCFRecommender(data.urm_train)
    rec2 = NewUserKNNAgeRecommender(data)
    rec3 = UserKNNCFRecommender(data.urm_train)
    rec1.fit(topK=500, shrink=1000, similarity='cosine', feature_weighting='TF-IDF')
    rec2.set_similarity([1])
    rec2.fit(topK=0)

    for alpha in [0.999990, 0.999995, 0.999999]:
        print("alpha:" + str(alpha))
        rec3.W_sparse = alpha * rec1.W_sparse + (1 - alpha) * rec2.W_sparse
        total_evaluation(rec3)
Ejemplo n.º 2
0
    def fit(self,
            topK=None,
            shrink=None,
            weights=None,
            pop=None,
            weights1=None,
            weights2=None,
            weights3=None,
            weights4=None,
            weights5=None,
            weights6=None,
            weights7=None,
            weights8=None,
            pop1=None,
            pop2=None,
            similarity='cosine',
            normalize=True,
            final_weights=None,
            final_weights1=None,
            final_weights2=None,
            old_similarity_matrix=None,
            epochs=1,
            top1=None,
            shrink1=None,
            force_compute_sim=False,
            weights_to_dweights=-1,
            **similarity_args):

        if topK is None:  # IT MEANS THAT I'M TESTING ONE RECOMMENDER ON A SPECIIFC INTERVAL
            topK = [top1]
            shrink = [shrink1]

        if self.weights is None:
            if weights1 is not None:
                weights = [
                    weights1, weights2, weights3, weights4, weights5, weights6,
                    weights7, weights8
                ]
                weights = [x for x in weights if x is not None]
            self.weights = weights

        if self.pop is None:
            if pop is None:
                pop = [pop1, pop2]
                pop = [x for x in pop if x is not None]
            self.pop = pop

        if weights_to_dweights != -1:
            self.d_weights[weights_to_dweights] = self.weights

        assert self.weights is not None, "Weights Are None!"

        assert len(self.recommender_list) == len(
            self.weights
        ), "Weights: {} and recommender list: {} have different lenghts".format(
            len(self.weights), len(self.recommender_list))

        assert len(topK) == len(shrink) == len(self.recommender_list), "Knns, Shrinks and recommender list have " \
                                                                       "different lenghts "

        self.normalize = normalize
        self.topK = topK
        self.shrink = shrink

        self.gradients = [0] * self.recommender_number
        self.MAE = 0
        p3counter = 0
        rp3bcounter = 0
        slim_counter = 0
        factorCounter = 0

        for knn, shrink, recommender in zip(topK, shrink,
                                            self.recommender_list):
            if recommender.__class__ is SLIM_BPR_Cython:
                if "lambda_i" in list(similarity_args.keys()
                                      ):  # lambda i and j provided in args
                    if type(similarity_args["lambda_i"]) is not list:
                        similarity_args["lambda_i"] = [
                            similarity_args["lambda_i"]
                        ]
                        similarity_args["lambda_j"] = [
                            similarity_args["lambda_j"]
                        ]
                    recommender.fit(
                        old_similarity_matrix=old_similarity_matrix,
                        epochs=epochs,
                        force_compute_sim=force_compute_sim,
                        topK=knn,
                        lambda_i=similarity_args["lambda_i"][slim_counter],
                        lambda_j=similarity_args["lambda_j"][slim_counter])
                else:
                    recommender.fit(
                        old_similarity_matrix=old_similarity_matrix,
                        epochs=epochs,
                        force_compute_sim=force_compute_sim,
                        topK=knn)
                slim_counter += 1

            elif recommender.__class__ in [
                    MatrixFactorization_BPR_Cython,
                    MatrixFactorization_FunkSVD_Cython,
                    MatrixFactorization_AsySVD_Cython
            ]:
                recommender.fit(epochs=epochs,
                                force_compute_sim=force_compute_sim)

            elif recommender.__class__ in [SLIMElasticNetRecommender]:
                recommender.fit(topK=knn,
                                l1_ratio=similarity_args["l1_ratio"],
                                force_compute_sim=force_compute_sim)

            elif recommender.__class__ in [PureSVDRecommender]:
                recommender.fit(
                    num_factors=similarity_args["num_factors"][factorCounter],
                    force_compute_sim=force_compute_sim)
                factorCounter += 1

            elif recommender.__class__ in [P3alphaRecommender]:
                if type(similarity_args["alphaP3"]) is not list:
                    similarity_args["alphaP3"] = [similarity_args["alphaP3"]]
                recommender.fit(topK=knn,
                                alpha=similarity_args["alphaP3"][p3counter],
                                min_rating=0,
                                implicit=True,
                                normalize_similarity=True,
                                force_compute_sim=force_compute_sim)
                p3counter += 1

            elif recommender.__class__ in [RP3betaRecommender]:
                recommender.fit(alpha=similarity_args["alphaRP3"][rp3bcounter],
                                beta=similarity_args["betaRP"][rp3bcounter],
                                min_rating=0,
                                topK=knn,
                                implicit=True,
                                normalize_similarity=True,
                                force_compute_sim=force_compute_sim)
                rp3bcounter += 1

            elif recommender.__class__ in [ItemKNNCBFRecommender]:
                recommender.fit(knn,
                                shrink,
                                force_compute_sim=force_compute_sim,
                                feature_weighting_index=similarity_args[
                                    "feature_weighting_index"])

            else:  # ItemCF, UserCF, ItemCBF, UserCBF
                recommender.fit(knn,
                                shrink,
                                force_compute_sim=force_compute_sim)

        print("Recommender list before: {}".format(self.recommender_list))
        self.W_sparse20 = csr_matrix(([], ([], [])), shape=(20635, 20635))
        self.W_sparse50 = csr_matrix(([], ([], [])), shape=(50446, 50446))
        to_delete = []
        for index, recommender in enumerate(self.recommender_list):
            try:
                self.W_sparse20 += self.weights[index] * recommender.W_sparse
                to_delete.append(recommender)
                print("Recommender {} is summed in W_sparse20".format(
                    recommender))
                continue
            except:
                # the recommender doesn't have a W sparse matrix of that shape
                a = 1

            try:
                self.W_sparse50 += self.weights[index] * recommender.W_sparse
                to_delete.append(recommender)
                print("Recommender {} is summed in W_sparse50".format(
                    recommender))
                continue
            except:
                # the recommender doesn't have a W sparse matrix of that shape
                a = 1

        # remove recommenders that already has the similarity merged
        self.recommender_list = [
            x for x in self.recommender_list if x not in to_delete
        ]

        print("Recommender list after: {}".format(self.recommender_list))
        new_item_recommender = ItemKNNCFRecommender(self.URM_train)
        new_item_recommender.W_sparse = self.W_sparse20
        self.recommender_list.append(new_item_recommender)

        new_user_recommender = UserKNNCFRecommender(self.URM_train)
        new_user_recommender.W_sparse = self.W_sparse50
        self.recommender_list.append(new_user_recommender)
        print("Recommender list final: {}".format(self.recommender_list))

        if final_weights is None:
            self.final_weights = [final_weights1, final_weights2]
        else:
            self.final_weights = final_weights

        assert len(final_weights) == len(
            self.recommender_list
        ), "Lunghezza di final weights e dei reccomender rimasti è diversa. Sono rimasti {} recommender con i final weight di lunghezza {}".format(
            len(self.recommender_list), len(final_weights))