Exemplo n.º 1
0
 def __init__(self, logger=None):
     super().__init__()
     self.logger = get_logger('item_cf')
     if logger is not None:
         self.logger = logger
     self.user_score_dict = self.init_user_score()
     # self.item_sim = self.item_similarity()
     self.item_sim = self.item_similarity_best()
    def __init__(self, datafile, logger=None):
        self.logger = get_logger('user_cf_recommend')
        if logger is not None:
            self.logger = logger
        self.datafile = datafile
        self.data = self.load_data()

        self.train_data, self.test_data = self.split_data(3, 47)
        self.user_sim = self.user_similarity_best()
    def __init__(self, datafile, ratio, logger=None):
        self.logger = get_logger('user_cf_recommend')
        if logger is not None:
            self.logger = logger

        # 原始数据路径文件
        self.datafile = datafile
        # 测试集与训练集的比例
        self.ratio = ratio
        self.item_sim_file = 'data/item_sim.json'
        self.data = self.load_data()

        self.train_data, self.test_data = self.split_data(3, 47)
        self.item_sim = self.item_similarity_best()
Exemplo n.º 4
0
        """
        score = 0.0
        for item1 in self.item_sim[item].keys():
            if item1 != item:
                score += self.item_sim[item][item1] * self.user_score_dict[
                    user][item1]

        return score

    def recommend(self, user):
        """
        为用户推荐物品
        :param user:
        :return:
        """
        # 计算user未评分item的可能评分
        user_item_score_dict = dict()
        for item in self.user_score_dict[user].keys():
            if self.user_score_dict[user][item] <= 0:
                user_item_score_dict[item] = self.pre_user_item_score(
                    user, item)

        return user_item_score_dict


if __name__ == '__main__':
    logger = get_logger('item_cf')
    ib = ItemCF(logger=logger)
    logger.info(ib.recommend('C'))
    logger.info(ib.recommend('A'))
        计算准确率
        :param k:
        :param nitems:
        :return:
        """
        self.logger.info('开始计算准确率...')
        hit = 0
        precision = 0
        for user in self.test_data.keys():
            u_items = self.test_data.get(user, {})
            result = self.recommend(user, k=k, nitems=nitems)
            for item, rate in result.items():
                if item in u_items:
                    hit += 1

            precision += nitems

        return hit / (precision * 1.0)


if __name__ == '__main__':
    logger = get_logger('item_cf_movie_recommend')
    ib = ItemCFRec(datafile='../../data/ml-1m/ratings.dat',
                   ratio=[1, 9],
                   logger=logger)
    logger.info(f'用户1进行推荐的结果如下: {ib.recommend("1")}')
    for k in range(5, 11, 1):
        for nitems in range(10, 22, 2):
            precision = ib.precision(k=k, nitems=nitems)
            logger.info(f'k = {k}, nitems={nitems}, precision is {precision}')
        precision = 0
        for user in self.train_data.keys():
            # tu: 用户实际评分的电影ID
            tu = self.test_data.get(user, {})
            # rank: 推荐系统推荐的电影ID
            rank = self.recommend(user, k=k, nitems=nitems)
            for item, rate in rank.items():
                if item in tu:
                    hit += 1

            precision += nitems

        self.logger.info(f'hit: {hit}')
        self.logger.info(f'precision: {precision}')
        return hit / (precision * 1.0)


if __name__ == '__main__':
    logger = get_logger('user_cf_recommend')
    cf = UserCFRec('../../data/ml-1m/ratings.dat', logger=logger)
    result = cf.recommend('1')
    logger.info(f'user "1" recommend result is {result}')
    precision = cf.precision()
    logger.info(f'k=8, n=10, precision is {precision}')
    for k in range(5, 10, 1):
        for nitems in range(10, 20, 2):
            precision = cf.precision(k=k, nitems=nitems)
            logger.info(f'k = {k}, nitems={nitems}, precision is {precision}')