个性推荐实战案例--基于协同过滤的电影推荐(附数据集)

该文介绍了如何运用协同过滤算法,包括User-Based和Item-Based两种方法,对MovieLens数据集进行电影评分预测及推荐。通过加载和处理ml-latest-small数据集,计算用户和电影之间的皮尔逊相似度,构建推荐系统。虽然示例适用于小规模数据,但在实际工业环境中,由于数据量大,通常会采用Spark等分布式计算工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

案例--基于协同过滤的电影推荐

已经基本掌握了协同过滤推荐算法,以及其中两种最基本的实现方案:User-Based CF和Item-Based CF,下面我们将利用真是的数据来进行实战演练。

案例需求 演示效果

分析案例

数据集下载

MovieLens Latest Datasets Small

建议下载ml-latest-small.zip,数据量小,便于我们单机使用和运行

目标:根据ml-latest-small/ratings.csv(用户-电影评分数据),分别实现User-Based CF和Item-Based CF,并进行电影评分的预测,然后为用户实现电影推荐

数据集加载
  • 加载ratings.csv,并转换为用户-电影评分矩阵

import osimport pandas as pdimport numpy as npDATA_PATH = "./datasets/ml-latest-small/ratings.csv"CACHE_DIR = "./datasets/cache/"def load_data(data_path):    '''    加载数据    :param data_path: 数据集路径    :param cache_path: 数据集缓存路径    :return: 用户-物品评分矩阵    '''    # 数据集缓存地址    cache_path = os.path.join(CACHE_DIR, "ratings_matrix.cache")    print("开始加载数据集...")    if os.path.exists(cache_path):    # 判断是否存在缓存文件        print("加载缓存中...")        ratings_matrix = pd.read_pickle(cache_path)        print("从缓存加载数据集完毕")    else:        print("加载新数据中...")        # 设置要加载的数据字段的类型        dtype = {"userId": np.int32, "movieId": np.int32, "rating": np.float32}        # 加载数据,我们只用前三列数据,分别是用户ID,电影ID,已经用户对电影的对应评分        ratings = pd.read_csv(data_path, dtype=dtype, usecols=range(3))        # 透视表,将电影ID转换为列名称,转换成为一个User-Movie的评分矩阵        ratings_matrix = ratings.pivot_table(index=["userId"], columns=["movieId"], values="rating")        # 存入缓存文件        ratings_matrix.to_pickle(cache_path)        print("数据集加载完毕")    return  ratings_matrixif __name__ == '__main__':    ratings_matrix = load_data(DATA_PATH)    print(ratings_matrix)
相似度计算
  • 计算用户或物品两两相似度:

# ......def compute_pearson_similarity(ratings_matrix, based="user"):    '''    计算皮尔逊相关系数    :param ratings_matrix: 用户-物品评分矩阵    :param based: "user" or "item"    :return: 相似度矩阵    '''    user_similarity_cache_path = os.path.join(CACHE_DIR, "user_similarity.cache")    item_similarity_cache_path = os.path.join(CACHE_DIR, "item_similarity.cache")    # 基于皮尔逊相关系数计算相似度    # 用户相似度    if based == "user":        if os.path.exists(user_similarity_cache_path):            print("正从缓存加载用户相似度矩阵")            similarity = pd.read_pickle(user_similarity_cache_path)        else:            print("开始计算用户相似度矩阵")            similarity = ratings_matrix.T.corr()            similarity.to_pickle(user_similarity_cache_path)    elif based == "item":        if os.path.exists(item_similarity_cache_path):            print("正从缓存加载物品相似度矩阵")            similarity = pd.read_pickle(item_similarity_cache_path)        else:            print("开始计算物品相似度矩阵")            similarity = ratings_matrix.corr()            similarity.to_pickle(item_similarity_cache_path)    else:        raise Exception("Unhandled 'based' Value: %s"%based)    print("相似度矩阵计算/加载完毕")    return similarityif __name__ == '__main__':    ratings_matrix = load_data(DATA_PATH)    user_similar = compute_pearson_similarity(ratings_matrix, based="user")    print(user_similar)    item_similar = compute_pearson_similarity(ratings_matrix, based="item")    print(item_similar)
注意

以上实现,仅用于实验阶段,因为工业上、或生产环境中,数据量是远超过我们本例中使用的数据量的,而pandas是无法支撑起大批量数据的运算的,因此工业上通常会使用spark、mapReduce等分布式计算框架来实现,我们后面的课程中也是建立在此基础上进行实践的。

但是正如前面所说,推荐算法的思想和理念都是统一的,不论使用什么平台工具、有多大的数据体量,其背后的实现原理都是不变的。

所以在本节,大家要深刻去学习的是推荐算法的业务流程,以及在具体的业务场景中,如本例的电影推荐,如何实现出推荐算法,并产生推荐结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lucky-zhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值