Price-Sensitive Recommendation — 价格感知推荐:弹性感知的个性化定价与排序融合
Skill-Price-Sensitive-Recommendation · 05-推荐系统
causalexperimentoptimizationrecommendationpricing广告与投放推荐与搜索定价与利润WF-B 广告优化WF-F 动态定价WF-G Listing内容优化
实现难度⭐⭐☆☆☆
业务视角
适用角色运营负责人 / 选品负责人 · 产品经理 · 广告优化师
适用平台Amazon · DTC 独立站 · 邮件/SMS 个性化
什么情况下用老客来了只买一件就走,相关产品没被推出去;Bundle 商品连带销售做不起来;站内推荐位点击率低
成功是什么样的老客连带购买率提升 20-35%,客单价提升,品类交叉销售做起来
业务痛点
1. 解决的问题
传统推荐系统只关注用户与商品的"相关性",完全忽视价格因素;而传统定价系统只优化利润或销量,不考虑用户个性化偏好。Price-Sensitive Recommendation 的核心思想是将个体价格弹性注入推荐排序决策
2. 核心算法逻辑
传统推荐系统只关注用户与商品的"相关性",完全忽视价格因素;而传统定价系统只优化利润或销量,不考虑用户个性化偏好。PriceSensitive Recommendation 的核心思想是将个体价格弹性注入推荐排序决策:
3. 业务应用场景
业务背景:Prime Day / Black Friday 母婴类目促销期间,某品牌对婴儿消毒器打折30%($59.99→$41.99)。但促销推送策略是"给所有收藏过该商品的用户群发",导致原本会全价购买的用户(低弹性)也被打折吸引,削减利润;而真正需要折扣激励才会购买的用户(高弹性)反而没被精准触达。
Price-Sensitive Recommendation 应用:
业务背景:AIM DTC 独立站(婴儿消毒设备)同时销售$49(基础款)、$79(升级款)、$129(旗舰款)三个价位产品。当前首页推荐对所有用户展示相同顺序,无法区分价格敏感度不同的访客。
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
- `final_score`:价格效用 + MF 锚定 + 促销增益的综合分
- `segment_label`:用户弹性分层(`low/medium/high_elastic`),可用于前端展示逻辑差异化
6. 业务价值 / ROI
未自动抽取;请查看原始 Skill 卡片。
7. 代码模板
代码块数量:4 · 路径:未检测到
"""
Price-Sensitive Recommendation: 价格感知个性化推荐
整合 MF 相关分 + 用户价格弹性估计 + 价格效用函数 + IPW 去偏
完全使用 mock 数据,无需真实 API
"""
import numpy as np
from dataclasses import dataclass, field
from typing import Dict, List, Optional, Tuple
# ── 数据结构 ──────────────────────────────────────────────────────────────────
@dataclass
class PriceHistory:
"""商品历史价格数据"""
product_id: str
prices: List[float] # 历史价格序列
sales_volumes: List[float] # 对应销量
reference_price: float = 0.0 # 参考价(类目均价)
def __post_init__(self):
if self.reference_price == 0.0 and self.prices:
self.reference_price = float(np.mean(self.prices))
@dataclass
class PricedProduct:
"""带价格信息的商品"""
product_id: str
name: str
current_price: float
original_price: float # 原价(促销时 < original_price)
category: str
reference_price: float = 0.0
@property
def is_on_sale(self) -> bool:
return self.current_price < self.original_price * 0.97
@property
def discount_rate(self) -> float:
if self.original_price <= 0:
return 0.0
return max(0.0, 1.0 - self.current_price / self.original_price)
@dataclass
class UserPriceProfile:
"""用户价格弹性画像"""
user_id: str
global_beta: float = 1.0 # 全局价格敏感系数 β_u
category_betas: Dict[str, float] = field(default_factory=dict)
purchase_price_history: List[float] = field(default_factory=list) # 历史购买价格
def get_beta(self, category: str) -> float:
"""获取特定品类的价格弹性"""
return self.category_betas.get(category, self.global_beta)
def elasticity_segment(self) -> str:
8. 论文来源
- 2403.07571
- 2408.11589
- 2501.09223