每次打开视频平台,首页推荐的影片总能精准命中你的喜好——这种"猜你喜欢"的魔力背后,正是个性化推荐系统在发挥作用。这个基于Django框架的协同过滤推荐系统,完整复现了从数据采集、算法实现到可视化展示的全流程。不同于简单的Demo项目,系统整合了大数据处理技术栈,能够应对百万级用户行为数据的实时分析。
我在实际构建中发现,一个工业级推荐系统需要平衡三大要素:算法精度(准确预测用户偏好)、响应速度(毫秒级返回结果)、可解释性(让用户理解推荐逻辑)。本系统采用经典的协同过滤算法作为核心,配合Django的高效ORM和模板渲染,最终实现平均响应时间低于200ms的推荐服务。对于计算机专业学生而言,这个项目能带你完整走通推荐系统开发全链路,从算法理论到工程落地,最终呈现为可交互的Web应用。
系统采用Lambda架构处理数据流,同时满足批处理和实时计算需求:
关键配置:Spark执行器内存分配需根据数据量调整,实测显示1GB内存可处理约10万条评分记录
python复制# 使用scipy稀疏矩阵存储大规模评分数据
from scipy.sparse import csr_matrix
ratings_matrix = csr_matrix((ratings, (users, movies)), shape=(max_user+1, max_movie+1))
python复制def weighted_pearson(u1, u2, min_overlap=5):
common = np.intersect1d(u1.indices, u2.indices)
if len(common) < min_overlap:
return 0
mean1 = u1.sum()/u1.nnz
mean2 = u2.sum()/u2.nnz
numerator = ((u1[common]-mean1)*(u2[common]-mean2)).sum()
denominator = np.sqrt(((u1[common]-mean1)**2).sum()) * np.sqrt(((u2[common]-mean2)**2).sum())
return numerator/(denominator+1e-8) # 防止除零
python复制# 处理缺失值
df = df.dropna(subset=['rating'])
# 时间戳转换
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
# 异常值过滤
df = df[(df['rating'] >= 1) & (df['rating'] <= 5)]
python复制class Movie(models.Model):
tmdb_id = models.IntegerField(unique=True)
title = models.CharField(max_length=200)
genres = models.CharField(max_length=100) # 逗号分隔的流派列表
avg_rating = models.FloatField(default=0)
def update_stats(self):
ratings = Rating.objects.filter(movie=self)
self.avg_rating = ratings.aggregate(Avg('value'))['value__avg']
self.save()
python复制@api_view(['GET'])
def get_recommendations(request):
user_id = request.user.id
# 从Redis获取实时兴趣
recent_views = redis_client.lrange(f'user:{user_id}:recent', 0, 4)
# 获取Spark预计算的相似用户
similar_users = spark_recommender.get_similar_users(user_id, k=10)
# 混合推荐逻辑
recommendations = hybrid_recommend(user_id, similar_users, recent_views)
return Response({'results': recommendations})
python复制# 错误做法:N+1查询问题
movies = Movie.objects.all()
for m in movies:
print(m.rating_set.count())
# 正确做法:使用annotate
movies = Movie.objects.annotate(
rating_count=Count('rating')
)
dockerfile复制# Django服务Dockerfile示例
FROM python:3.8
RUN pip install gunicorn
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . /app
WORKDIR /app
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "project.wsgi"]
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 推荐结果重复率高 | 用户行为数据不足 | 启用热门补足策略 |
| 新用户推荐质量差 | 冷启动问题 | 混合基于内容的推荐 |
| 响应时间波动大 | Redis连接泄漏 | 检查连接池配置 |
| 内存持续增长 | 矩阵未稀疏化 | 使用scipy.sparse格式 |
在实现过程中,我发现协同过滤算法对数据密度非常敏感——当用户-物品矩阵稀疏度超过95%时,推荐准确率会显著下降。这时需要引入矩阵补全技术或切换到深度学习模型。另一个教训是:永远要在Django的settings.py中配置SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db',否则高并发时数据库会话可能成为瓶颈。