协同过滤算法基础
协同过滤分为基于用户的协同过滤(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=, columns=, values=)
user_similarity = cosine_similarity(user_restaurant_matrix.fillna())
target_user_idx = user_restaurant_matrix.index.get_loc(target_user_id)
similar_users = user_similarity[target_user_idx].argsort()[-:-]
similar_users_ratings = user_restaurant_matrix.iloc[similar_users]
predicted_scores = similar_users_ratings.mean(axis=)
predicted_scores.sort_values(ascending=).head()


