当前位置:   article > 正文

人工智能之个性推荐案例--算法实现:User-Based CF 预测评分_人工智能个性化推荐代码

人工智能个性化推荐代码

案例--算法实现:User-Based CF 预测评分

评分预测公式:

算法实现

  • 实现评分预测方法:predict

    1. # ......
    2. def predict(uid, iid, ratings_matrix, user_similar):
    3.     '''
    4.     预测给定用户对给定物品的评分值
    5.     :param uid: 用户ID
    6.     :param iid: 物品ID
    7.     :param ratings_matrix: 用户-物品评分矩阵
    8.     :param user_similar: 用户两两相似度矩阵
    9.     :return: 预测的评分值
    10.     '''
    11.     print("开始预测用户<%d>对电影<%d>的评分..."%(uid, iid))
    12.     # 1. 找出uid用户的相似用户
    13.     similar_users = user_similar[uid].drop([uid]).dropna()
    14.     # 相似用户筛选规则:正相关的用户
    15.     similar_users = similar_users.where(similar_users>0).dropna()
    16.     if similar_users.empty is True:
    17.         raise Exception("用户<%d>没有相似的用户" % uid)
    18.     # 2. 从uid用户的近邻相似用户中筛选出对iid物品有评分记录的近邻用户
    19.     ids = set(ratings_matrix[iid].dropna().index)&set(similar_users.index)
    20.     finally_similar_users = similar_users.ix[list(ids)]
    21.     # 3. 结合uid用户与其近邻用户的相似度预测uid用户对iid物品的评分
    22.     sum_up = 0    # 评分预测公式的分子部分的值
    23.     sum_down = 0    # 评分预测公式的分母部分的值
    24.     for sim_uid, similarity in finally_similar_users.iteritems():
    25.         # 近邻用户的评分数据
    26.         sim_user_rated_movies = ratings_matrix.ix[sim_uid].dropna()
    27.         # 近邻用户对iid物品的评分
    28.         sim_user_rating_for_item = sim_user_rated_movies[iid]
    29.         # 计算分子的值
    30.         sum_up += similarity * sim_user_rating_for_item
    31.         # 计算分母的值
    32.         sum_down += similarity
    33.     # 计算预测的评分值并返回
    34.     predict_rating = sum_up/sum_down
    35.     print("预测出用户<%d>对电影<%d>的评分:%0.2f" % (uid, iid, predict_rating))
    36.     return round(predict_rating, 2)
    37. if __name__ == '__main__':
    38.     ratings_matrix = load_data(DATA_PATH)
    39.     user_similar = compute_pearson_similarity(ratings_matrix, based="user")
    40.     # 预测用户1对物品1的评分
    41.     predict(11, ratings_matrix, user_similar)
    42.     # 预测用户1对物品2的评分
    43.     predict(12, ratings_matrix, user_similar)
  • 实现预测全部评分方法:predict_all

    1. # ......
    2. def predict_all(uid, ratings_matrix, user_similar):
    3.     '''
    4.     预测全部评分
    5.     :param uid: 用户id
    6.     :param ratings_matrix: 用户-物品打分矩阵
    7.     :param user_similar: 用户两两间的相似度
    8.     :return: 生成器,逐个返回预测评分
    9.     '''
    10.     # 准备要预测的物品的id列表
    11.     item_ids = ratings_matrix.columns
    12.     # 逐个预测
    13.     for iid in item_ids:
    14.         try:
    15.             rating = predict(uid, iid, ratings_matrix, user_similar)
    16.         except Exception as e:
    17.             print(e)
    18.         else:
    19.             yield uid, iid, rating
    20. if __name__ == '__main__':
    21.     ratings_matrix = load_data(DATA_PATH)
    22.     user_similar = compute_pearson_similarity(ratings_matrix, based="user")
    23.     for i in predict_all(1, ratings_matrix, user_similar):
    24.         pass
  • 添加过滤规则

    1. def _predict_all(uid, item_ids, ratings_matrix, user_similar):
    2.     '''
    3.     预测全部评分
    4.     :param uid: 用户id
    5.     :param item_ids: 要预测的物品id列表
    6.     :param ratings_matrix: 用户-物品打分矩阵
    7.     :param user_similar: 用户两两间的相似度
    8.     :return: 生成器,逐个返回预测评分
    9.     '''
    10.     # 逐个预测
    11.     for iid in item_ids:
    12.         try:
    13.             rating = predict(uid, iid, ratings_matrix, user_similar)
    14.         except Exception as e:
    15.             print(e)
    16.         else:
    17.             yield uid, iid, rating
    18. def predict_all(uid, ratings_matrix, user_similar, filter_rule=None):
    19.     '''
    20.     预测全部评分,并可根据条件进行前置过滤
    21.     :param uid: 用户ID
    22.     :param ratings_matrix: 用户-物品打分矩阵
    23.     :param user_similar: 用户两两间的相似度
    24.     :param filter_rule: 过滤规则,只能是四选一,否则将抛异常:"unhot","rated",["unhot","rated"],None
    25.     :return: 生成器,逐个返回预测评分
    26.     '''
    27.     if not filter_rule:
    28.         item_ids = ratings_matrix.columns
    29.     elif isinstance(filter_rule, str) and filter_rule == "unhot":
    30.         '''过滤非热门电影'''
    31.         # 统计每部电影的评分数
    32.         count = ratings_matrix.count()
    33.         # 过滤出评分数高于10的电影,作为热门电影
    34.         item_ids = count.where(count>10).dropna().index
    35.     elif isinstance(filter_rule, str) and filter_rule == "rated":
    36.         '''过滤用户评分过的电影'''
    37.         # 获取用户对所有电影的评分记录
    38.         user_ratings = ratings_matrix.ix[uid]
    39.         # 评分范围是1-5,小于6的都是评分过的,除此以外的都是没有评分的
    40.         _ = user_ratings<6
    41.         item_ids = _.where(_==False).dropna().index
    42.     elif isinstance(filter_rule, list) and set(filter_rule) == set(["unhot""rated"]):
    43.         '''过滤非热门和用户已经评分过的电影'''
    44.         count = ratings_matrix.count()
    45.         ids1 = count.where(count > 10).dropna().index
    46.         user_ratings = ratings_matrix.ix[uid]
    47.         _ = user_ratings < 6
    48.         ids2 = _.where(_ == False).dropna().index
    49.         # 取二者交集
    50.         item_ids = set(ids1)&set(ids2)
    51.     else:
    52.         raise Exception("无效的过滤参数")
    53.     yield from _predict_all(uid, item_ids, ratings_matrix, user_similar)
    54. if __name__ == '__main__':
    55.     ratings_matrix = load_data(DATA_PATH)
    56.     user_similar = compute_pearson_similarity(ratings_matrix, based="user")
    57.     for result in predict_all(1, ratings_matrix, user_similar, filter_rule=["unhot""rated"]):
    58.         print(result)
  • 根据预测评分为指定用户进行TOP-N推荐:

    1. # ......
    2. def top_k_rs_result(k):
    3.     ratings_matrix = load_data(DATA_PATH)
    4.     user_similar = compute_pearson_similarity(ratings_matrix, based="user")
    5.     results = predict_all(1, ratings_matrix, user_similar, filter_rule=["unhot""rated"])
    6.     return sorted(results, key=lambda x: x[2], reverse=True)[:k]
    7. if __name__ == '__main__':
    8.     from pprint import pprint
    9.     result = top_k_rs_result(20)
    10.     pprint(result)

二 推荐系统设计

2.1 推荐系统要素

  • UI 和 UE(前端界面)

  • 数据 (Lambda架构)

  • 业务知识

  • 算法

2.2 推荐系统架构

  • 推荐系统整体架构

  • 大数据Lambda架构

    • 由Twitter工程师Nathan Marz(storm项目发起人)提出

    • Lambda系统架构提供了一个结合实时数据和Hadoop预先计算的数据环境和混合平台, 提供一个实时的数据视图

    • 分层架构

      • 批处理层
        • 数据不可变, 可进行任何计算, 可水平扩展

        • 高延迟 几分钟~几小时(计算量和数据量不同)

        • 日志收集 Flume

        • 分布式存储 Hadoop hdfs

        • 分布式计算 Hadoop MapReduce & spark

        • 视图存储数据库
          • nosql(HBase/Cassandra)

          • Redis/memcache

          • MySQL

      • 实时处理层
        • 流式处理, 持续计算

        • 存储和分析某个窗口期内的数据

        • 最终正确性(Eventual accuracy)

        • 实时数据收集 flume & kafka

        • 实时数据分析 spark streaming/storm/flink

      • 服务层
        • 支持随机读

        • 需要在非常短的时间内返回结果

        • 读取批处理层和实时处理层结果并对其归并

    • Lambda架构图

  • 推荐算法架构

    • 召回阶段(海选)
      • 召回决定了最终推荐结果的天花板

      • 常用算法:
        • 协同过滤(基于用户 基于物品的)

        • 基于内容 (根据用户行为总结出自己的偏好 根据偏好 通过文本挖掘技术找到内容上相似的商品)

        • 基于隐语义

    • 排序阶段
      • 召回决定了最终推荐结果的天花板, 排序逼近这个极限, 决定了最终的推荐效果

      • CTR预估 (点击率预估 使用LR算法) 估计用户是否会点击某个商品 需要用户的点击数据

    • 策略调整

  • 推荐系统的整体架构

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/86452
推荐阅读
相关标签
  

闽ICP备14008679号