Diversity-Aware Reranking with SMMR
Skill-Diversity-Reranking-SMMR · 05-推荐系统
causalexperimentoptimizationrecommendationragpricing供应链与补货推荐与搜索定价与利润WF-A 智能补货WF-F 动态定价WF-G Listing内容优化
实现难度⭐⭐☆☆☆
业务优先级⭐⭐⭐⭐☆
业务视角
适用角色运营负责人 / 选品负责人 · 产品经理 · 广告优化师
适用平台Amazon · DTC 独立站 · 邮件/SMS 个性化
什么情况下用老客来了只买一件就走,相关产品没被推出去;Bundle 商品连带销售做不起来;站内推荐位点击率低
成功是什么样的老客连带购买率提升 20-35%,客单价提升,品类交叉销售做起来
业务痛点
1. 解决的问题
传统推荐系统追求相关性最大化,导致结果高度同质化——用户搜"婴儿奶粉",首页全是同一品牌同一段位。
2. 核心算法逻辑
核心问题:传统推荐系统追求相关性最大化,导致结果高度同质化——用户搜"婴儿奶粉",首页全是同一品牌同一段位。长期看会:
3. 业务应用场景
业务问题:母婴电商首页"猜你喜欢"长期被2-3个爆款奶粉/纸尿裤占据,用户浏览深度下降,新品上架3个月无曝光。
SMMR 应用: 1. 召回层:Top-100候选(按相关性排序) 2. 多样性重排序: - 品类维度:奶粉、纸尿裤、辅食、玩具、童装均衡 - 品牌维度:避免同一品牌连续出现 - 价格维度:高/中/低档搭配 - 年龄段维度:0-6月、6-12月、1-2岁、2岁+ 3. 参数调优:$\lambda=0.7$(重相关性),$t=1.2$(中高多样性)
预期产出: - 首页品类覆盖:3个 → 8个品类 - 平均浏览深度:+25% - 长尾商品点击率:+40% - 整体转化率:维持或微降(<2%),但GMV结构更健康
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI:长尾GMV提升15-30%,新品冷启动周期缩短50%
- 难度:⭐⭐☆☆☆(2/5)— 轻量后处理,A/B测试友好
- 优先级:⭐⭐⭐⭐☆(4/5)— 直接替换现有重排模块,落地快
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
Diversity-Aware Reranking — SMMR (Sampling-Based MMR)
用于推荐系统结果列表的多样性重排序
"""
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
class SMMR:
"""Sampling-Based MMR Reranker"""
def __init__(self, lambda_param=0.7, temperature=1.0, batch_growth=2):
self.lambda_param = lambda_param
self.temperature = temperature
self.batch_growth = batch_growth
def rerank(self, item_ids, relevance_scores, item_features, k=10):
"""
SMMR重排序
Args:
item_ids: 候选商品ID列表
relevance_scores: 相关性分数
item_features: 商品特征向量 (n_items, dim)
k: 输出列表长度
"""
n = len(item_ids)
selected = []
selected_features = []
remaining = set(range(n))
# 标准化相关性分数
rel_norm = (relevance_scores - relevance_scores.min()) / \
(relevance_scores.max() - relevance_scores.min() + 1e-8)
while len(selected) < k and remaining:
# 计算每个剩余商品的MMR分数
mmr_scores = []
for i in remaining:
# 相关性项
rel_term = self.lambda_param * rel_norm[i]
# 多样性项:与已选商品的最大相似度
if selected_features:
sims = cosine_similarity(
item_features[i:i+1],
np.array(selected_features)
)[0]
max_sim = sims.max()
else:
max_sim = 0
div_term = (1 - self.lambda_param) * max_sim
mmr_score = rel_term - div_term
mmr_scores.append((i, mmr_score))
# 概率采样(温度参数控制随机性)
scores = np.array([s for _, s in mmr_scores])
scores = scores / self.temperature
8. 论文来源
未自动抽取;请查看原始 Skill 卡片。