1. 项目概述
这个基于Python+Django的电商推荐系统是我在研究生期间完成的一个实战项目,主要解决电商平台中用户面临的信息过载问题。系统采用了双协同过滤算法(基于用户和基于物品)来实现个性化商品推荐,同时整合了数据可视化功能,为电商平台提供了一个完整的推荐解决方案。
作为一个完整的毕业设计项目,它涵盖了从前端界面到后端算法、从数据库设计到可视化展示的全栈开发流程。我在开发过程中遇到了不少坑,特别是在算法实现和性能优化方面,后面会详细分享这些经验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 整体技术栈
系统采用分层架构设计,主要技术组件如下:
- 前端层:HTML5 + Bootstrap构建响应式界面,Echarts实现数据可视化
- 业务逻辑层:Django框架处理业务逻辑,包括用户认证、商品管理、推荐算法等
- 数据访问层:MySQL存储核心业务数据,SQLite存储轻量级配置信息
- 算法层:Python实现的协同过滤推荐算法
这种分层设计使得系统各模块职责明确,便于维护和扩展。我在架构设计时特别考虑了电商系统的高并发特性,采用了Django的缓存机制来提升系统响应速度。
2.2 数据库设计
数据库设计采用了关系型数据库范式,主要表结构包括:
-
用户表(User):
- 存储用户基本信息
- 包含username、password、email等字段
- 设置索引优化查询性能
-
商品表(Shop):
- 商品ID、名称、价格、描述等基本信息
- 销量、收藏数等统计字段
- 多对多关联标签(Tag)
-
评分表(Rate):
- 用户ID、商品ID、评分值
- 创建时间索引
-
标签表(Tag):
- 商品分类标签
- 与商品多对多关联
提示:在实际开发中,我遇到了N+1查询问题,通过Django的select_related和prefetch_related优化了查询性能,这部分经验会在后面详细分享。
3. 核心算法实现
3.1 基于用户的协同过滤
基于用户的协同过滤(UserCF)是本系统的核心算法之一,其核心思想是"相似用户喜欢相似商品"。具体实现步骤如下:
-
用户相似度计算:
使用皮尔逊相关系数衡量用户相似度:python复制def pearson(self, user1, user2): sum_xy = 0.0 # 共同评分项乘积和 n = 0 # 共同评分项数 sum_x = 0.0 # user1评分和 sum_y = 0.0 # user2评分和 sumX2 = 0.0 # user1评分平方和 sumY2 = 0.0 # user2评分平方和 for shop1, score1 in user1.items(): if shop1 in user2.keys(): n += 1 sum_xy += score1 * user2[shop1] sum_x += score1 sum_y += user2[shop1] sumX2 += pow(score1, 2) sumY2 += pow(user2[shop1], 2) if n == 0: return 0 molecule = sum_xy - (sum_x * sum_y) / n denominator = sqrt((sumX2 - pow(sum_x, 2)/n) * (sumY2 - pow(sum_y, 2)/n)) if denominator == 0: return 0 return molecule / denominator -
最近邻用户查找:
python复制def nearest_user(self, current_user, n=1): distances = {} for user, rate_set in self.all_user.items(): if user != current_user: distance = self.pearson(self.all_user[current_user], self.all_user[user]) distances[user] = distance return sorted(distances.items(), key=operator.itemgetter(1), reverse=True)[:n] -
生成推荐列表:
python复制def recommend(self, username, n=3): recommend = {} nearest_user = self.nearest_user(username, n) for user, score in dict(nearest_user).items(): for shops, scores in self.all_user[user].items(): if shops not in self.all_user[username].keys(): if shops not in recommend.keys(): recommend[shops] = scores * score return sorted(recommend.items(), key=operator.itemgetter(1), reverse=True)
3.2 基于物品的协同过滤
基于物品的协同过滤(ItemCF)是另一种推荐策略,核心思想是"用户喜欢与其历史偏好相似的商品"。实现要点:
-
商品相似度计算:
python复制def similarity(shop1_id, shop2_id): shop1_set = Rate.objects.filter(shop_id=shop1_id) shop1_sum = shop1_set.count() shop2_sum = Rate.objects.filter(shop_id=shop2_id).count() common = Rate.objects.filter( user_id__in=Subquery(shop1_set.values('user_id')), shop=shop2_id ).values('user_id').count() if shop1_sum == 0 or shop2_sum == 0: return 0 return common / sqrt(shop1_sum * shop2_sum) -
推荐生成逻辑:
python复制def recommend_by_item_id(user_id, k=15): user_prefer = UserTagPrefer.objects.filter(user_id=user_id) user_prefer = list(user_prefer.order_by('-score').values_list('tag_id', flat=True))[:3] current_user = User.objects.get(id=user_id) if current_user.rate_set.count() == 0: if len(user_prefer) != 0: return shop.objects.filter(tags__in=user_prefer)[:15] else: return shop.objects.order_by("-num")[:15] un_watched = shop.objects.filter( ~Q(rate__user_id=user_id), tags__in=user_prefer ).order_by('?')[:30] watched = Rate.objects.filter(user_id=user_id).values_list('shop_id', 'mark') distances = [] for un_watched_shop in un_watched: for watched_shop in watched: distances.append(( similarity(un_watched_shop.id, watched_shop[0]) * watched_shop[1], un_watched_shop )) distances.sort(key=lambda x: x[0], reverse=True) recommend_list = [] for mark, shop in distances: if len(recommend_list) >= k: break if shop not in recommend_list: recommend_list.append(shop) return recommend_list
4. 系统功能实现
4.1 用户交互模块
-
注册登录系统:
- 采用Django内置的认证系统
- 密码加密存储
- Session管理用户状态
-
商品展示与搜索:
- 支持多种排序方式(销量、价格等)
- 关键词搜索功能
- 标签分类导航
-
用户行为记录:
- 收藏功能
- 商品评分
- 评论系统
4.2 数据可视化
系统集成了Echarts实现多维度的数据展示:
- 柱状图:展示商品销量和分类占比
- 词云图:可视化高频店铺和关键词
- 饼图:呈现商品品类分布
- 折线图:分析销量趋势变化
实现示例:
javascript复制// Echarts柱状图配置示例
option = {
title: { text: '商品分类销量统计' },
tooltip: {},
xAxis: { data: ['电子产品', '服装', '食品', '家居', '图书'] },
yAxis: {},
series: [{
name: '销量',
type: 'bar',
data: [1200, 800, 600, 400, 300]
}]
};
4.3 后台管理系统
-
用户管理:
- 用户信息查看/编辑
- 权限控制
-
商品管理:
- 商品CRUD操作
- 批量导入导出
-
数据统计:
- 用户行为分析
- 销售数据报表
5. 开发经验与优化
5.1 性能优化实践
-
数据库查询优化:
- 使用select_related减少查询次数
- 添加适当的数据库索引
- 分页加载大数据集
-
算法优化:
- 相似度矩阵预计算
- 定期更新推荐结果缓存
- 使用numpy加速矩阵运算
-
前端性能优化:
- 静态资源CDN加速
- 图片懒加载
- 减少DOM操作
5.2 踩坑记录
-
冷启动问题:
- 新用户缺乏历史数据
- 解决方案:结合热门推荐和标签偏好
-
数据稀疏性:
- 用户-商品矩阵稀疏
- 解决方案:引入默认评分和混合推荐
-
实时性挑战:
- 用户行为实时反馈
- 解决方案:增量更新策略
6. 项目部署
6.1 环境准备
-
服务器配置:
- Ubuntu 20.04 LTS
- Python 3.8+
- MySQL 5.7
-
依赖安装:
bash复制
pip install -r requirements.txt -
数据库迁移:
bash复制
python manage.py makemigrations python manage.py migrate
6.2 生产环境配置
-
Gunicorn部署:
bash复制gunicorn --workers 4 --bind 0.0.0.0:8000 recomend.wsgi:application -
Nginx反向代理:
nginx复制server { listen 80; server_name yourdomain.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/; } } -
安全配置:
- HTTPS加密
- CSRF防护
- SQL注入防护
7. 项目扩展方向
-
推荐算法增强:
- 引入深度学习模型
- 结合上下文信息
- 多目标优化
-
系统功能扩展:
- 社交化推荐
- 实时推荐
- AB测试框架
-
架构升级:
- 微服务化改造
- 引入消息队列
- 分布式计算
这个项目从零开始构建了一个完整的电商推荐系统,涵盖了从算法设计到前后端实现的完整流程。在实际开发过程中,最大的收获是理解了推荐系统在实际业务场景中的应用挑战,以及如何平衡算法精度和系统性能。
