【AI 项目实战】基于协同过滤的电影推荐系统 Flask Web 项目:User-CF、Item-CF、混合推荐与可视化实现 推荐系统是 AI 项目实战里非常适合写成完整案例的方向。相比目标检测项目需要准备图片、标注、训练权重,推荐系统更适合用结构化数据快速完成一个可运行系统;相比大模型 RAG 项目需要本地模型或 API,协同过滤推荐系统不依赖模型权重,也不需要 GPU,只要有用户评分数据,就能构建出“用户喜欢什么、相似用户喜欢什么、相似电影有哪些、下一部电影应该推荐什么”的完整闭环。本文围绕一个真实可运行的 Flask Web 项目展开:基于协同过滤的电影推荐系统。系统使用内置电影评分数据,构建用户-电影评分矩阵,实现用户协同过滤 User-CF、物品协同过滤 Item-CF 和混合推荐 Hybrid,并提供 Flask 页面、API 接口、电影详情页、用户画像页、数据看板、评分提交和离线验证脚本。项目解压后安装依赖即可运行,适合用于 CSDN 技术博客、课程设计、项目展示、推荐算法入门实践和二次开发。一、为什么选择“电影推荐系统”作为今天的 AI 项目实战选题推荐系统是很多互联网产品的核心能力。电商要推荐商品,短视频要推荐内容,音乐平台要推荐歌曲,电影网站要推荐影片。对入门项目而言,电影推荐系统的好处在于业务容易理解,数据结构清晰,结果也容易展示。用户看过哪些电影、给过多少分、和哪些用户偏好相近、下一步适合推荐哪些电影,这些都可以直接转化成可视化页面和表格结果。从项目交付角度看,电影推荐系统还有三个优势。第一,项目不依赖深度学习权重。协同过滤主要依赖评分矩阵和相似度计算,不需要训练神经网络,也不需要下载 YOLO、BERT 或大语言模型权重。只要 Python 环境能安装 Flask、pandas、numpy、matplotlib,就能运行完整系统。第二,代码逻辑适合讲解。协同过滤不是单纯调一个黑盒接口,而是可以清楚拆成数据读取、评分矩阵构建、相似度计算、评分预测、Top-N 排序、Web 展示等步骤。每个步骤都能对应到一个源码模块,适合写成 CSDN 干货文章。第三,展示效果完整。项目可以展示首页、推荐结果页、电影详情页、相似电影列表、用户画像页、评估指标图和相似度热力图。读者不只是看到一段算法代码,而是能看到一个 Web 系统真正跑起来。电影推荐系统的业务背景来自真实观影场景:用户进入影院或线上平台后,会根据类型偏好、历史评分、相似影片和热门趋势选择下一部电影。下面这张影院座位实景图适合作为项目场景引入,说明推荐算法最终服务的是具体的观影选择。本文项目没有直接把 MovieLens 数据集打包到源码中,而是内置了一份小型演示数据,保证离线也能运行。如果后续要做大规模实验,可以参考 GroupLens 官方提供的 MovieLens 100K 或 MovieLens Latest Small 数据集,把字段映射到本项目的movies.csv、ratings.csv和users.csv。二、项目最终效果展示先看系统运行后的主要页面和结果。运行命令如下:python run_demo.py --user-id1--methodhybrid --top-n10python app.py启动 Flask 后,浏览器访问:浏览器访问运行日志中显示的本地地址下面三张页面图来自 Flask 服务启动后的浏览器真实访问结果,后面的得分、评估和相似度图由离线验证脚本基于同一份评分数据生成。首页主要展示项目介绍、电影数量、用户数量、评分数量、平均评分、热门电影和推荐入口。用户可以选择一个用户 ID,再选择推荐方法:hybrid、user或item。推荐结果页展示当前用户的 Top-N 推荐电影。每条推荐结果都包含电影标题、年份、类型、预测评分、置信度和推荐理由。这里的推荐理由不是随便写的,而是根据用户已经给过高分的相似电影生成,例如“与用户高分电影《Star Wars》《Her》相似”。电影详情页展示电影简介、评分统计、用户评分表单和相似电影列表。相似电影来自 Item-CF 的电影相似度矩阵,适合解释“看过这部电影的人还可能喜欢什么”。推荐得分图直观展示 Top-N 电影的预测评分排序。这个图适合放在项目报告或博客运行效果部分,说明系统不是只返回标题列表,而是有算法得分依据。评估图展示 User-CF、Item-CF 和 Hybrid 三种方法的 MAE、RMSE 对比。当前内置数据的验证结果如下:methodmaermsecatalog_coveragetest_ratingsuser0.57540.73530.8333157item0.52330.66890.9833157hybrid0.53350.68290.9157相似度热力图用于观察电影之间的 item-item 相似关系。颜色越接近,说明两部电影在用户评分行为上越相似。三、系统功能设计本项目不是只写一个“推荐函数”,而是做成一个可以直接运行和展示的 Flask Web 系统。核心功能包括:1. 数据读取 - 读取电影元数据 movies.csv - 读取用户画像 users.csv - 读取用户评分 ratings.csv - 合并 Web 页面新提交的 runtime_ratings.csv 2. 协同过滤算法 - 构建用户-电影评分矩阵 - 计算用户相似度 - 计算电影相似度 - 用户协同过滤评分预测 - 物品协同过滤评分预测 - 混合推荐排序 3. Web 系统 - 首页 - 推荐结果页 - 电影详情页 - 用户画像页 - 数据看板页 - JSON API 接口 4. 结果保存 - 推荐结果 CSV - 推荐结果 JSON - 评估报告 JSON - 运行验证报告 JSON - 运行截图和图表项目结构图如下:推荐流程图如下:整个流程可以概括为:电影数据 + 用户数据 + 评分数据 ↓ 构建用户-电影评分矩阵 ↓ 用户相似度 / 电影相似度 ↓ User-CF / Item-CF 评分预测 ↓ Hybrid 混合排序 ↓ Flask 页面展示与 API 输出四、项目目录结构完整项目目录如下:movie_cf_flask_recommender/ ├── app.py ├── run_demo.py ├── README.md ├── blog.md ├── requirements.txt ├── requirements_full.txt ├── run.bat ├── run.sh ├── configs/ │ └── config.yaml ├── demo_data/ │ ├── movies.csv │ ├── ratings.csv │ ├── users.csv │ └── README_DATA.md ├── src/ │ ├── data_loader.py │ ├── recommender.py │ ├── evaluator.py │ ├── visualization.py │ ├── database.py │ ├── utils.py │ └── __init__.py ├── templates/ │ ├── base.html │ ├── index.html │ ├── recommendations.html │ ├── movie_detail.html │ ├── user_profile.html │ ├── dashboard.html │ └── error.html ├── static/ │ ├── css/ │ │ └── style.css │ └── js/ │ └── app.js ├── outputs/ │ ├── recommendations_user_1.csv │ ├── recommendations_user_1.json │ ├── evaluation_report.json │ ├── evaluation_summary.csv │ └── validation_report.json ├── images/ │ ├── figures/ │ └── results/ ├── docs/ ├── tests/ └── weights/ └── README_WEIGHTS.md这个结构把“算法核心”和“Web 展示”分开。src/recommender.py只负责推荐算法,app.py只负责 Web 路由,templates/负责页面展示,run_demo.py负责离线验证和截图生成。这样设计的好处是后续扩展比较方便:要换成 FastAPI,可以复用算法模块;要加数据库,也不需要重写推荐算法;要接入 MovieLens,只需要替换数据读取和字段映射。五、数据格式设计项目内置三份 CSV 数据:demo_data/movies.csv demo_data/users.csv demo_data/ratings.csvmovies.csv的字段如下:movie_id,title,year,genres,description,poster_color 1,Toy Story,1995,Animation|Adventure|Comedy,玩