1. 项目背景与核心价值
在信息爆炸的时代,美食爱好者们常常面临"选择困难症"——打开食谱APP,面对海量菜谱却不知从何下手。这正是我们团队开发这个基于协同过滤算法的美食推荐系统的初衷。作为一个完整的计算机毕业设计项目,它完美融合了Python全栈开发和机器学习两大热门技术方向。
这个系统的独特之处在于:
- 采用Django框架构建完整Web应用
- 实现基于用户行为的协同过滤推荐
- 集成ECharts等可视化组件
- 包含从数据采集到模型部署的全流程
提示:选择美食推荐作为毕设主题的优势在于——数据获取相对容易,业务逻辑清晰,技术栈丰富且能充分展示你的全栈能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体架构图
code复制前端展示层(Django模板)
↑
业务逻辑层(Views)
↑
推荐算法层(协同过滤)
↑
数据存储层(MySQL + Redis)
2.2 关键技术选型对比
| 技术组件 | 选型理由 | 替代方案 |
|---|---|---|
| Django框架 | 内置Admin、ORM等组件,开发效率高 | Flask |
| 协同过滤算法 | 实现简单且推荐效果直观 | 内容推荐/深度学习 |
| ECharts | 丰富的图表类型和交互功能 | Pyecharts/Matplotlib |
| MySQL | 关系型数据存储 | PostgreSQL |
| Redis | 用户行为缓存和会话管理 | Memcached |
3. 核心算法实现细节
3.1 协同过滤算法实现
我们采用基于用户的协同过滤(UserCF),核心公式:
用户相似度计算(余弦相似度):
code复制sim(u,v) = ∑(r_ui * r_vi) / (√∑r_ui² * √∑r_vi²)
推荐得分计算:
code复制pred(u,i) = r̄_u + ∑[sim(u,v)*(r_vi - r̄_v)] / ∑|sim(u,v)|
Python实现关键代码:
python复制from sklearn.metrics.pairwise import cosine_similarity
def calculate_user_similarity(user_ratings):
# 用户-物品评分矩阵
rating_matrix = pd.DataFrame(user_ratings).fillna(0)
# 计算余弦相似度
similarity = cosine_similarity(rating_matrix)
return pd.DataFrame(similarity, index=rating_matrix.index,
columns=rating_matrix.index)
3.2 算法优化技巧
- 冷启动问题:新用户采用热门推荐+随机推荐策略
- 数据稀疏性:采用加权混合推荐(70%协同过滤+30%内容推荐)
- 实时性要求:使用Redis缓存用户最近行为
4. Django工程实践
4.1 项目结构
code复制food_recommend/
├── apps/
│ ├── account/ # 用户系统
│ ├── recipe/ # 菜谱管理
│ └── recommend/ # 推荐算法
├── static/ # 静态资源
├── templates/ # 前端模板
└── food_rec/ # 项目配置
4.2 关键配置示例
settings.py数据库配置:
python复制DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'food_recommend',
'USER': 'root',
'PASSWORD': 'yourpassword',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
# Redis缓存配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
5. 可视化实现方案
5.1 前端技术栈
- 基础框架:Bootstrap 5
- 图表库:ECharts 5
- 交互效果:jQuery + Ajax
5.2 典型可视化案例
用户口味偏好雷达图:
javascript复制// templates/recipe/detail.html
function drawRadarChart(data){
var chart = echarts.init(document.getElementById('radar-chart'));
var option = {
radar: {
indicator: [
{ name: '辣度', max: 5},
{ name: '甜度', max: 5},
{ name: '酸度', max: 5},
{ name: '难度', max: 5},
{ name: '耗时', max: 120}
]
},
series: [{
type: 'radar',
data: [{value: data}]
}]
};
chart.setOption(option);
}
6. 项目部署与优化
6.1 生产环境部署
推荐使用Docker-compose编排:
yaml复制version: '3'
services:
web:
build: .
command: gunicorn food_rec.wsgi:application --bind 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- redis
- db
redis:
image: redis:alpine
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: food_recommend
MYSQL_ROOT_PASSWORD: yourpassword
6.2 性能优化方案
-
数据库优化:
- 为常用查询字段添加索引
- 使用select_related/prefetch_related减少查询次数
-
缓存策略:
- 热门菜谱缓存1小时
- 用户相似度矩阵每日更新
- 使用Django的cache_page装饰器缓存视图
-
异步任务:
python复制# 使用Celery处理耗时任务 @shared_task def update_recommendations(user_id): # 更新用户推荐列表 pass
7. 毕业设计扩展建议
-
数据采集方案:
- 爬取美食网站数据(注意robots.txt)
- 使用公开数据集(如Kaggle上的Recipe Dataset)
- 设计用户评分模拟器生成测试数据
-
答辩亮点设计:
- 对比不同推荐算法的效果(RMSE指标)
- 展示推荐结果的多样性(覆盖率指标)
- 演示系统响应时间优化对比
-
项目文档建议:
- 技术选型对比分析
- 算法原理说明文档
- 系统测试用例报告
- 用户手册和API文档
注意:在实际开发中,建议先构建最小可行产品(MVP),再逐步添加高级功能。例如先实现基础推荐功能,再优化算法和界面。
