1. 项目概述
校园美食推荐系统是一个基于Django框架和K-means聚类算法的智能推荐平台,旨在为高校师生提供个性化的餐饮服务推荐。系统通过分析用户的历史就餐记录、口味偏好和消费习惯,结合校园内各餐厅的菜品数据,运用机器学习算法实现精准推荐。
作为一名长期从事教育信息化系统开发的工程师,我在实际校园项目中发现:传统校园餐饮服务存在信息不对称、选择困难、排队时间长等问题。这个项目正是为了解决这些痛点而设计的,它不仅能帮助学生快速找到符合口味的美食,还能优化餐厅的客流分布。
2. 系统架构设计
2.1 技术栈选型
后端框架选择Django的原因:
- 快速开发:Django自带admin后台、ORM等组件,适合毕业设计的时间要求
- 成熟稳定:作为Python最成熟的Web框架,社区资源丰富
- RESTful支持:通过Django REST framework可快速构建API接口
前端技术组合:
- Vue.js:组件化开发便于功能扩展
- Element UI:提供美观的界面组件
- ECharts:用于数据可视化展示
数据库选型考虑:
- MySQL:关系型数据库,适合存储结构化数据
- Redis:缓存用户行为数据,提高推荐实时性
2.2 系统架构图
code复制[用户层]
│
▼
[表现层] Vue前端
│
▼
[业务层] Django + K-means算法
│
▼
[数据层] MySQL + Redis
3. 核心算法实现
3.1 K-means算法原理
K-means是一种无监督学习算法,在本系统中用于对用户和菜品进行聚类分析。其工作原理如下:
- 随机选择K个初始中心点
- 计算每个数据点到中心点的距离
- 将数据点分配到最近的中心点所属簇
- 重新计算每个簇的中心点
- 重复2-4步直到收敛
算法伪代码实现:
python复制def k_means(data, k):
# 初始化中心点
centers = initialize_centers(data, k)
while not converged:
clusters = [[] for _ in range(k)]
# 分配数据点到最近的中心
for point in data:
distances = [distance(point, center) for center in centers]
cluster_idx = np.argmin(distances)
clusters[cluster_idx].append(point)
# 更新中心点
new_centers = [np.mean(cluster, axis=0) for cluster in clusters]
# 检查收敛
if distance(centers, new_centers) < threshold:
converged = True
centers = new_centers
return clusters, centers
3.2 推荐系统实现
数据预处理步骤:
- 用户特征提取:消费频率、价格偏好、菜品类别偏好等
- 菜品特征提取:价格、口味、烹饪方式、营养成分等
- 标准化处理:使用MinMaxScaler归一化特征值
推荐流程:
- 用户登录系统
- 获取用户历史行为数据
- 提取用户特征向量
- 计算与各菜品簇中心的距离
- 推荐距离最近的簇中的菜品
4. 系统功能模块
4.1 用户管理模块
关键数据库表设计:
sql复制CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(100) NOT NULL,
`preference` json DEFAULT NULL,
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
用户偏好更新逻辑:
- 记录用户每次点餐行为
- 定时(每天凌晨)运行批处理任务更新用户偏好
- 使用滑动窗口算法计算近期偏好权重
4.2 餐厅管理模块
餐厅数据表设计考虑:
- 地理位置信息:用于就近推荐
- 营业时间:避免推荐已关闭的餐厅
- 容量信息:结合实时人流数据避免过度推荐
4.3 推荐引擎模块
实时推荐流程:
- 接收用户请求
- 从Redis获取用户最近特征向量
- 查询候选菜品集
- 运行推荐算法
- 过滤不符合条件的项目(如已售罄)
- 返回推荐结果
5. 系统部署方案
5.1 开发环境配置
Python环境:
bash复制# 创建虚拟环境
python -m venv venv
# 安装依赖
pip install -r requirements.txt
关键依赖项:
- Django==3.2
- django-rest-framework
- scikit-learn
- pandas
- celery
5.2 生产环境部署
Nginx配置示例:
code复制server {
listen 80;
server_name foodrec.example.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /static/ {
alias /path/to/static/files;
}
}
Supervisor配置:
code复制[program:foodrec]
command=/path/to/venv/bin/gunicorn foodrec.wsgi:application
directory=/path/to/project
user=www-data
autostart=true
autorestart=true
6. 项目难点与解决方案
6.1 冷启动问题
问题描述:
新用户没有历史数据,无法进行有效推荐
解决方案:
- 基于人口统计学的推荐:年级、专业等
- 热门推荐:展示当前最受欢迎的菜品
- 随机探索:按一定比例推荐新菜品
6.2 算法性能优化
优化措施:
- 使用Mini-Batch K-means替代传统K-means
- 对特征向量进行PCA降维
- 实现增量更新算法,避免全量重计算
6.3 实时性保证
技术方案:
- 使用Celery异步任务队列处理用户行为日志
- Redis缓存近期用户特征
- 定时任务每日全量更新用户长期偏好
7. 系统测试与评估
7.1 测试方案设计
测试数据集:
- 模拟生成1000名用户数据
- 包含5个餐厅的200种菜品
- 3个月的消费记录数据
评估指标:
- 推荐准确率
- 响应时间
- 用户满意度调查
7.2 测试结果
性能测试数据:
| 并发用户数 | 平均响应时间(ms) | 错误率 |
|---|---|---|
| 50 | 120 | 0% |
| 100 | 180 | 0% |
| 200 | 320 | 0.2% |
推荐准确率:
- 老用户:78.5%
- 新用户:52.3%(使用混合推荐策略后)
8. 项目扩展方向
- 移动端开发:开发配套小程序,支持扫码点餐
- 智能排队系统:结合推荐结果预测各餐厅人流高峰
- 营养分析:增加菜品营养成分分析功能
- 社交功能:好友推荐分享、组团点餐
在实际开发过程中,我发现Django的admin界面可以快速搭建后台管理系统,大大减少了开发时间。同时,使用Vue的前后端分离架构使得界面开发更加灵活。最大的挑战在于K-means算法的参数调优,需要通过多次实验确定最佳的簇数量和特征权重。