基于用户画像的食谱推荐系统
这是一个基于 Flask + SQLite + 规则引擎 + 轻量机器学习的食谱推荐系统,面向课程设计/演示场景。
项目封面

项目说明
基于用户画像的食谱推荐系统
1. 项目简介
这是一个基于 Flask + SQLite + 规则引擎 + 轻量机器学习的食谱推荐系统,面向课程设计/演示场景。
系统核心思路:
- 采集用户问卷与活动数据(步数、活动分钟)
- 构建用户特征向量并进行用户画像聚类
- 基于规则过滤和打分,再结合随机森林回归模型进行排序
- 输出可解释的推荐结果(规则命中原因 + 模型融合说明)
项目目标是提供一个可运行、可展示、可扩展的端到端闭环,而不是工业级推荐系统。
2. 技术栈
- 语言:Python 3.12.x
- Web 框架:Flask 3.x
- ORM:Flask-SQLAlchemy 3.x
- 登录认证:Flask-Login
- 数值计算:NumPy
- 机器学习:scikit-learn(KMeans、RandomForestRegressor)
- 前端:Jinja2 模板 + Bootstrap + ECharts
- 数据库:SQLite(默认
diet_recommend.db) - 测试:pytest
依赖定义见 requirements.txt。
3. 项目目录结构
diet-recommend-system/
├── app.py # 应用入口
├── config.py # 配置(密钥、数据库 URI、端口等)
├── requirements.txt
├── 项目说明.md
├── 测试说明.md
├── app/
│ ├── __init__.py # 应用工厂
│ ├── cli.py # Flask CLI(init-db、seed-data、evaluate 等)
│ ├── extensions.py # db、login_manager
│ ├── models.py # ORM 模型
│ ├── tag_labels.py # 食谱标签中英文映射
│ ├── seed_recipes_data.py # 演示食谱种子数据
│ ├── blueprints/
│ │ ├── auth.py # 注册 / 登录 / 登出
│ │ └── main.py # 工作台、问卷、推荐、活动等页面路由
│ └── services/
│ ├── preprocessing.py # 问卷清洗、用户特征向量
│ ├── profile_builder.py # 聚类、画像标签、同步写库
│ ├── recipe_engine.py # 规则打分、混合推荐
│ ├── ml_train.py # 随机森林训练与 ranker 模型文件
│ ├── evaluation.py # 离线 Hit@K、NDCG
│ └── association_mining.py # 标签共现(支持度)
├── templates/ # Jinja2 页面模板
├── static/ # 静态资源(CSS 等)
├── tests/ # pytest
├── mac/ # macOS 辅助脚本(部署与启动见项目内部署手册)
├── instance/ # 运行时目录(如 ranker.pkl,勿提交敏感内容)
└── diet_recommend.db # SQLite 数据库(本地运行时生成)
4. 功能模块说明
4.1 用户与认证
- 注册、登录、登出
- 登录后可填写问卷、记录活动、查看画像、生成推荐
- 已修复登录
next参数开放重定向风险(只允许站内路径)
4.2 问卷与活动数据
问卷字段包括:
- 年龄段、性别、身高体重
- 目标(减脂/维持/增重/增肌/健康)
- 活动水平、饮食风格
- 过敏项、不喜食材
- 每日餐次、热量目标
活动字段包括:
- 日期、步数、活动分钟、备注
系统会将活动数据融合进用户向量末 3 维(最近 14 天):
- 平均步数归一化
- 平均活动分钟归一化
- 记录覆盖度
4.3 用户画像(聚类 + 标签)
- 从所有有问卷的用户构建特征向量
- 使用 KMeans 聚类(样本太少时做稳健处理)
- 生成中文标签文本(目标、风格、过敏、活动特征)
- 将结果写入
UserProfile
注意:单用户时不会强行聚类,会走单用户兜底逻辑,避免 n_clusters > n_samples 异常。
4.4 推荐引擎
推荐流程分为两层:
- 规则层(硬约束 + 基线分)
- 过敏标签命中直接剔除
- 不喜食材与食材名称子串匹配命中直接剔除
- 根据目标、饮食风格、脂肪控制、单餐热量匹配增加得分
- 模型层(可选)
- 将用户向量与食谱特征拼接
- 随机森林预测分与规则分融合(0.55 / 0.45)
- 模型不可用或维度不匹配时自动回退为规则排序
输出包含可解释说明(命中规则和融合详情)。
4.5 数据挖掘展示
insights页面提供食谱标签共现统计(支持度)- 用于展示“关联规则挖掘”模块的可视化结果
5. 数据模型说明
主要模型(app/models.py):
User:用户账号、密码哈希、问卷 JSON、特征向量 JSONUserActivity:活动日志UserProfile:画像簇编号、标签、标签 JSONRecipe:食谱基础数据(食材/营养/步骤/标签)RecipeGeneration:推荐生成记录与明细
时间字段已采用时区感知时间(UTC)写法,避免 datetime.utcnow() 的弃用问题。
6. 推荐与画像的数据流(端到端)
- 用户注册并登录
- 提交问卷 -> 清洗/标准化 -> 保存问卷 JSON
- 构建用户特征向量(问卷 15 维 + 活动 3 维)
- 同步所有用户画像(聚类 + 标签)
- 用户发起推荐
- 规则过滤与打分,必要时叠加模型预测
- 返回 TopN 结果并写入推荐日志
7. 特征工程与准确性策略
当前用户特征总维度为 18 维:
- 问卷特征:15 维
- 活动特征:3 维
已做关键优化:序数与连续特征统一归一化到 [0,1] 量级,降低距离模型(KMeans)被高量纲字段主导的风险,提升画像稳定性与可解释性。
8. CLI 命令说明
通过 flask 命令可执行:
flask init-db:建表flask seed-data:导入演示用户/食谱/活动并训练模型flask rebuild-profiles:重建用户画像flask rebuild-model:重训排序模型flask evaluate:离线评估 Hit@K、NDCGflask replace-recipes:清空并重导食谱后重训模型
9. 已知限制
- 离线评估使用“弱标签”(由规则分派生),不能等价真实用户反馈
- 关联规则模块当前仅支持支持度统计,未扩展置信度/提升度
- 推荐模型使用规则分做监督信号,属于“弱监督近似学习”
单元测试与运行方式见 测试说明.md。
10. 快速排障
- 启动后无法登录演示账号:
- 删除
diet_recommend.db与.data_seeded后按部署手册重新初始化并导入数据
- 删除
- 页面提示模型不可用:
- 执行
flask rebuild-model
- 执行
- 画像结果异常:
- 执行
flask rebuild-profiles
- 执行
- 修改特征工程后建议:
- 重新
seed-data或rebuild-model,避免旧模型参数不一致
- 重新
11. 许可与用途
本项目用于教学与课程设计演示。
技术分类
包含内容
适用人群
学习参考与二次开发
关于 AI源码
AI源码 专注优质项目源码分享,提供完整源码、详细文档与技术支持,助力源码设计与课程作业。
相关推荐
查看全部 →
城市交通流量预测与拥堵成因分析系统
是一个面向城市交通拥堵分析的 monorepo,覆盖计算机设计课题中的主要能力链路:

电商用户行为漏斗与CRO转化率优化分析
电商用户行为漏斗与CRO转化率优化分析(E-Commerce Funnel CRO)是一套面向电商运营的数据分析平台,覆盖从用户访问到最终购买的完整漏斗链路,提供多维诊断、统计检验、PIE 优先级矩阵与 XGBoost 购买预测等能力,帮助运营团队精准定位转化瓶颈并制定优化策略。

多组学癌症预后预测分析系统
基于 Flask 的 Web 应用,用于上传 TCGA 风格合并表、做特征与标签概览、Cox 预后风险评分与生存相关可视化。模型在本地训练后以 形式加载,不提供旧版演示数据或假模型兜底。

基于 Apriori 算法的中药配伍审查系统
本系统是一个基于经典 Apriori 关联规则挖掘算法的中药配伍审查平台,使用真实中医药处方数据集(PTM-TKDE2018),实现药材频繁项集挖掘、关联规则生成与配伍禁忌审查。

基于 Python 的城市共享单车骑行需求时空分析系统
本系统是一个基于 Python Flask 框架的城市共享单车骑行需求时空分析平台,使用 Oslo City Bike(奥斯陆城市自行车)开放数据,提供系统总览、时间维度分析、空间维度分析、站点运营分析、OD 起讫流动分析、骑行需求预测、综合分析报告等功能模块,适用于城市共享单车运营调度与骑行需求研究场景。

基于 Python 的短视频用户行为分析系统
基于快手 KuaiRec / KuaiRand 数据集的短视频推荐分析平台,提供用户行为分析、推荐偏差检测、内容运营洞察、图神经网络推荐等完整分析链路。