paper2skills Playbook

Price-Sensitive Recommendation — 价格感知推荐:弹性感知的个性化定价与排序融合

Skill-Price-Sensitive-Recommendation · 05-推荐系统

causalexperimentoptimizationrecommendationpricing广告与投放推荐与搜索定价与利润WF-B 广告优化WF-F 动态定价WF-G Listing内容优化
实现难度⭐⭐☆☆☆
业务视角
适用角色运营负责人 / 选品负责人 · 产品经理 · 广告优化师
适用平台Amazon · DTC 独立站 · 邮件/SMS 个性化
什么情况下用老客来了只买一件就走,相关产品没被推出去;Bundle 商品连带销售做不起来;站内推荐位点击率低
成功是什么样的老客连带购买率提升 20-35%,客单价提升,品类交叉销售做起来
业务痛点
老客复购率上不去相关产品没有被看到Bundle 凑单没人用新品没有曝光机会

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