协同过滤算法基础
协同过滤分为基于用户的协同过滤(User-Based CF)和基于物品的协同过滤(Item-Based CF)。核心思想是通过用户历史行为数据(如评分、点击)计算相似度,预测未评分项目的偏好。
- 相似度计算:常用余弦相似度、皮尔逊相关系数。
- 余弦相似度公式: [ \text{sim}(u, v) = \frac{\sum_{i \in I_{uv}} r_{ui} \cdot r_{vi}}{\sqrt{\sum_{i \in I_{u}} r_{ui}^2} \cdot \sqrt{\sum_{i \in I_{v}} r_{vi}^2}} ]
- 皮尔逊相关系数: [ \text{sim}(u, v) = \frac{\sum_{i \in I_{uv}} (r_{ui} - \bar{r}u)(r{vi} - \bar{r}v)}{\sqrt{\sum{i \in I_{uv}} (r_{ui} - \bar{r}u)^2} \cdot \sqrt{\sum{i \in I_{uv}} (r_{vi} - \bar{r}_v)^2}} ]
- 评分预测:加权平均用户或物品的相似评分。
Django 系统架构设计
采用 MTV(Model-Template-View)模式,核心模块包括用户管理、餐厅数据、评分记录和推荐引擎。
数据模型(models.py 示例):
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
# 其他字段如地理位置、饮食偏好
class Restaurant(models.Model):
name = models.CharField(max_length=200)
cuisine_type = models.CharField(max_length=100)
# 其他字段如评分、价格区间
class Rating(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
score = models.FloatField()
# 用户评分(1-5 分)
推荐引擎实现
使用 Python 的 scikit-surprise 或 pandas 库实现协同过滤算法。
基于用户的 CF 示例代码:
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
def user_based_cf(target_user_id, ratings_df):
# 构建用户 - 餐厅评分矩阵
user_restaurant_matrix = ratings_df.pivot_table(index='user_id', columns='restaurant_id', values='score')
user_similarity = cosine_similarity(user_restaurant_matrix.fillna(0))
# 找到相似用户
target_user_idx = user_restaurant_matrix.index.get_loc(target_user_id)
similar_users = user_similarity[target_user_idx].argsort()[-5:-1]
# 取前 4 个相似用户
# 预测未评分餐厅
similar_users_ratings = user_restaurant_matrix.iloc[similar_users]
predicted_scores = similar_users_ratings.mean(axis=0)
return predicted_scores.sort_values(ascending=False).head(10)
性能优化与冷启动问题
- 矩阵分解:使用 SVD 或 ALS 降低计算复杂度。
- 混合推荐:结合内容过滤(如餐厅类型、价格)缓解冷启动。
- 实时更新:定期重训练模型或增量更新相似度矩阵。
前端交互与 API 设计
- 前端展示:通过 Ajax 调用 API,使用 Vue.js 或 React 渲染推荐列表。
RESTful API(Django REST Framework):
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view(['GET'])
def get_recommendations(request, user_id):
ratings_data = Rating.objects.all().values('user_id', 'restaurant_id', 'score')
df = pd.DataFrame(list(ratings_data))
recommendations = user_based_cf(user_id, df)
return Response(recommendations.to_dict())
评估与部署
- 评估指标:RMSE、精确率@K(Precision@K)。
- 部署:Docker 容器化,Nginx+Gunicorn 部署。
以上大纲涵盖技术实现关键点,可根据实际需求扩展冷启动策略(如基于流行度推荐)或引入深度学习模型(如神经协同过滤)。


