1. 项目背景与核心价值
每次打开外卖软件面对上百家餐厅时,选择困难症就会发作。这个推荐系统要解决的就是这个痛点——通过分析用户历史订单和相似用户的选择,自动推荐最可能符合口味的美食。不同于简单按销量或评分排序,协同过滤算法能捕捉到"喜欢川菜的人通常也爱湘菜"这类隐藏关联。
我在开发这套系统时发现,餐饮推荐有三大特殊性:1)用户口味差异极大(有人无辣不欢,有人一点辣不沾)2)消费频次高(每周可能点5-10次外卖)3)存在明显时段特征(早餐爱豆浆油条,夜宵偏好烧烤)。这些特点让传统推荐策略效果大打折扣。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 数据层处理
原始订单数据需要转化为用户-菜品评分矩阵。这里有个关键技巧:不能简单用点餐次数作为评分。我们设计了加权公式:
code复制评分 = 点餐次数 × 0.6 + 重复点餐间隔系数 × 0.4
间隔系数=1/(最近两次点餐间隔天数),这样上周连续点3次的酸菜鱼会比半年前点过5次的水煮鱼权重更高。
2.2 相似度计算优化
余弦相似度计算时遇到稀疏矩阵问题——用户平均只尝试过0.3%的菜品。我们采用SVD矩阵分解降维,把5000维的菜品空间压缩到150维,不仅提升计算效率,还发现了"早餐党"、"健身餐族"等潜在用户群体。
实际测试发现,当用户历史订单少于15单时推荐准确率会骤降。我们的解决方案是:新用户先用基于内容的推荐(菜品标签匹配),积累足够数据后再切换协同过滤。
3. 核心算法实现
3.1 用户相似度计算
核心代码片段(Python):
python复制from scipy.spatial.distance import cosine
def user_similarity(user1, user2):
# 获取共同评分菜品索引
common_items = np.intersect1d(
np.where(~np.isnan(user1)),
np.where(~np.isnan(user2))
)
if len(common_items) < 5: # 共同评价过至少5道菜
return 0
vec1 = user1[common_items
