news 2026/8/25 12:39:16

Day 90:【99天精通Python】项目篇(二) - 电影推荐系统 (下) - 算法实现与 API 开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 90:【99天精通Python】项目篇(二) - 电影推荐系统 (下) - 算法实现与 API 开发

Day 90:【99天精通Python】项目篇(二) - 电影推荐系统 (下) - 算法实现与 API 开发

前言

欢迎来到第90天!

在昨天,我们已经完成了数据探索和预处理,并计算出了用户之间的相似度矩阵。今天,我们要完成这个项目的最后两步:

  1. 编写推荐算法:根据相似度,为指定用户生成推荐列表。
  2. 封装为 API:使用 Flask 将推荐功能封装成一个 API 接口。

这将是我们 99 天旅程中的最后一个大型实战项目,它综合了数据分析、机器学习和 Web 开发的知识。

本节内容:

  • 实现 User-Based CF 推荐函数
  • 封装推荐逻辑为类
  • 搭建 Flask API 接口
  • 测试推荐效果
  • 项目总结与可扩展方向

一、推荐算法实现

我们的目标是:get_recommendations(user_id, num_recommendations=10)

算法步骤回顾:

  1. 找出与user_id最相似的 K 个邻居。
  2. 找出这些邻居"高分评价过"但user_id"没看过"的电影。
  3. 对这些电影进行加权评分,排序后返回 Top N。
importpandasaspdfromsklearn.metrics.pairwiseimportcosine_similarity# --- 以下代码为 Day 89 的回顾,假设已运行 ---movies=pd.read_csv("./ml-latest-small/movies.csv")ratings=pd.read_csv("./ml-latest-small/ratings.csv")df=pd.merge(ratings,movies,on="movieId")movie_matrix=df.pivot_table(index='userId',columns='title',values='rating')user_item_matrix=movie_matrix.fillna(0)user_similarity=cosine_similarity(user_item_matrix)user_sim_df=pd.DataFrame(user_similarity,index=user_item_matrix.index,columns=user_item_matrix.index)# --- 核心推荐函数 ---defget_recommendations(user_id,num_recommendations=10):# 1. 找到该用户的相似度向量,并排除自己similar_users=user_sim_df[user_id].drop(user_id).sort_values(ascending=False)# 2. 筛选 Top K 邻居 (这里我们简化,取所有相似度>0的用户)neighbors=similar_users[similar_users>0]ifneighbors.empty:returnpd.Series(dtype='float64')# 没有相似用户# 3. 找出用户看过的电影,用于过滤user_watched_movies=user_item_matrix.loc[user_id]user_watched_movies=user_watched_movies[user_watched_movies>0].index.values# 4. 计算推荐分数recommend_scores=pd.Series(dtype='float64')forneighbor_id,similarityinneighbors.items():# 获取邻居看过的电影neighbor_movies=user_item_matrix.loc[neighbor_id]formovie_title,ratinginneighbor_movies[neighbor_movies>4].items():# 只考虑高分电影ifmovie_titlenotinuser_watched_movies:# 累加分数 (相似度 * 邻居评分)recommend_scores.loc[movie_title]=recommend_scores.get(movie_title,0)+similarity*rating# 5. 返回 Top Nreturnrecommend_scores.sort_values(ascending=False).head(num_recommendations)# 测试recs=get_recommendations(1)print(recs)

二、代码封装

为了方便在 Flask 中调用,我们把整个逻辑封装成一个类。

# recommend_engine.pyimportpandasaspdfromsklearn.metrics.pairwiseimportcosine_similarityclassRecommendationEngine:def__init__(self,ratings_path,movies_path):self.movies=pd.read_csv(movies_path)self.ratings=pd.read_csv(ratings_path)self._prepare_data()def_prepare_data(self):print("正在准备数据...")df=pd.merge(self.ratings,self.movies,on="movieId")movie_matrix=df.pivot_table(index='userId',columns='title',values='rating')self.user_item_matrix=movie_matrix.fillna(0)print("正在计算相似度...")user_similarity=cosine_similarity(self.user_item_matrix)self.user_sim_df=pd.DataFrame(user_similarity,index=self.user_item_matrix.index,columns=self.user_item_matrix.index)print("引擎准备就绪!")defget_recommendations(self,user_id,n=10):# ... (将上面的函数逻辑搬到这里) ...# 注意修改变量名为 self.xxxsimilar_users=self.user_sim_df[user_id].drop(user_id).sort_values(ascending=False)# ... (后续逻辑同上)# 为了方便 API 返回,我们把结果转成 list of dictrecs_df=recs.reset_index()recs_df.columns=['title','score']returnrecs_df.to_dict('records')

三、Flask API 接口

现在,我们创建一个简单的 Flask 应用来暴露这个推荐服务。

# app.pyfromflaskimportFlask,jsonify,requestfromrecommend_engineimportRecommendationEngine# 假设上面的类已保存app=Flask(__name__)# --- 全局加载推荐引擎 (只在启动时加载一次) ---print("正在初始化推荐引擎,请稍候...")engine=RecommendationEngine("./ml-latest-small/ratings.csv","./ml-latest-small/movies.csv")@app.route("/recommend",methods=["GET"])defrecommend():# 从 URL 参数获取 user_iduser_id=request.args.get('user_id',type=int)ifnotuser_id:returnjsonify({"error":"缺少 user_id 参数"}),400try:recommendations=engine.get_recommendations(user_id)returnjsonify(recommendations)exceptKeyError:returnjsonify({"error":f"用户{user_id}不存在"}),404if__name__=="__main__":# host='0.0.0.0' 让局域网内其他设备也能访问app.run(debug=True,host='0.0.0.0',port=5001)

四、测试 API

  1. 启动 Flask 应用:python app.py
  2. 等待引擎初始化完成。
  3. 打开浏览器或 Postman,访问http://127.0.0.1:5001/recommend?user_id=1

你应该能看到类似这样的 JSON 返回:

[{"title":"Star Wars: Episode IV - A New Hope (1977)","score":10.5},{"title":"Fight Club (1999)","score":8.2},...]

五、项目总结与可扩展方向

至此,一个最基础的协同过滤推荐系统就完成了。虽然它很简单,但麻雀虽小,五脏俱全。

5.1 缺点与优化

  • 性能问题:每次推荐都要遍历大量用户,计算量巨大。生产环境中通常会离线计算好结果存入 Redis。
  • 冷启动问题:新用户没有评分,无法推荐。需要结合"热门推荐"等策略。
  • 稀疏性问题:用户-物品矩阵非常稀疏,影响相似度计算。可以使用矩阵分解等更高级的算法(如 SVD)。

5.2 可扩展方向

  • Item-Based CF:计算物品之间的相似度(买了"Python入门"的人还买了什么?),适合物品数量远小于用户数的场景。
  • 模型驱动:使用surprise库或深度学习(如LightGCN)来构建更精准的模型。
  • 前端集成:做一个漂亮的前端页面,调用 API 展示推荐结果。

六、小结

恭喜你,完成了这个贯穿数据分析、机器学习和 Web 开发的综合项目!

我们回顾一下这个项目的技术栈:

  • 数据处理:Pandas
  • 机器学习:Scikit-Learn (Cosine Similarity)
  • Web 服务:Flask

你已经证明了你有能力将多个领域的知识整合起来,解决一个复杂的实际问题。


七、课后作业

  1. Item-CF 实现:尝试实现基于物品的协同过滤,并对比与 User-CF 推荐结果的异同。
  2. API 健壮性:给 API 增加缓存(使用 Redis),对同一个用户 ID 的请求,1 小时内直接返回缓存结果。
  3. UI 界面:使用 Streamlit 或 Gradio(比 Flask 更简单的 UI 库),给你的推荐系统做一个简单的交互界面。

下节预告

Day 91:项目篇(三) - AI 聊天机器人 (上) - 结合 LangChain 与 Web- 推荐系统告一段落。明天,我们将启动最后一个终极项目:做一个带记忆、能联网、能读文档的 Web 版 AI 聊天机器人!


系列导航

  • 上一篇:Day 89 - 电影推荐系统 (上)
  • 下一篇:Day 91 - AI聊天机器人 (上)(待更新)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 22:48:55

手把手教你用css vh打造动态Grid结构

用 CSS vh 打造真正自适应的 Grid 布局:从原理到实战 你有没有遇到过这样的场景? 在手机上打开一个网页,页面底部被浏览器地址栏“吃掉”了一截; 桌面端仪表盘中间留着大片空白,而移动端内容却溢出滚动&#xff1…

作者头像 李华
网站建设 2026/8/19 19:40:03

Qwen2.5-7B边缘计算部署:Jetson设备适配实战案例

Qwen2.5-7B边缘计算部署:Jetson设备适配实战案例 1. 背景与挑战:大模型在边缘端的落地需求 随着生成式AI技术的快速发展,大型语言模型(LLM)已从云端逐步向边缘设备延伸。然而,受限于算力、内存和功耗&…

作者头像 李华
网站建设 2026/8/17 7:52:26

HY-MT1.5-1.8B部署实战:边缘计算场景应用

HY-MT1.5-1.8B部署实战:边缘计算场景应用 1. 引言 随着全球化进程的加速,跨语言沟通需求在企业服务、跨境电商、内容本地化等场景中日益增长。传统云端机器翻译方案虽然性能强大,但在延迟敏感型边缘计算场景中面临网络依赖高、响应慢、数据…

作者头像 李华
网站建设 2026/8/22 1:18:22

AI智能体上线的流程

AI智能体(AI Agent)的上线不再仅仅是“发布一个网页”,它更像是一个具有行动能力的数字员工入职。由于Agent具备自主决策权,其上线流程中对安全护栏和环境隔离的要求极高。以下是AI智能体上线的标准化流程:1. 环境准备…

作者头像 李华
网站建设 2026/8/10 16:53:46

智能摘要生成与文本优化工具:九款平台的性能测试与用户反馈分析

核心工具对比速览 工具名称 主要功能 生成速度 适用场景 独特优势 AIBiye 论文全流程辅助 3-5分钟/万字 开题到定稿 实证研究自动生成 AICheck 文献综述专家 2分钟/篇 文献梳理阶段 知网文献智能解析 AskPaper 学术问答助手 实时响应 研究过程答疑 支持中英…

作者头像 李华
网站建设 2026/8/23 22:12:24

OpenCV文档扫描仪部署教程:5分钟实现智能扫描

OpenCV文档扫描仪部署教程:5分钟实现智能扫描 1. 引言 1.1 业务场景描述 在日常办公与学习中,我们经常需要将纸质文档、发票、白板笔记等转换为电子版进行归档或分享。传统方式依赖专业扫描仪或手动裁剪,效率低且效果差。而市面上主流的“…

作者头像 李华