paper2skills Playbook

超稀疏矩阵补全 - 每行仅2-5个观测值的页面转移矩阵恢复

Skill-Sparse-Matrix-Completion · 14-用户分析

causalexperimentforecastingoptimization客服与VOC推荐与搜索WF-C 客服分诊WF-E Review监控WF-H 复购增长
年化 ROI
实现难度⭐⭐☆☆☆
业务优先级⭐⭐⭐⭐⭐
业务视角
适用角色运营负责人 / 用户增长负责人 · CMO · 产品经理
适用平台Amazon 买家分层 · DTC 站 LTV 预测 · Klaviyo/Brevo 邮件分群
什么情况下用有大量老客户,但不知道谁是高价值客户、谁快要流失;新客获取成本越来越高,老客复购却上不去
成功是什么样的用户按 RFM/LTV 分层精准触达,高价值用户留存率提升,老客贡献收入占比从 30% 提升到 50%
业务痛点
老客复购率上不去不知道哪些用户要流失了所有用户用同一套活动买过一次就不见了

1. 解决的问题

传统矩阵补全(如 SoftImpute、ALS)假设"大部分条目可观测",但电商session的页面转移矩阵天然稀疏——每个用户session只有3-5次页面跳转,导致采样概率 `p = C/d`(C≈2-5, d=页面类型数),绝大多数转移对从未被同一用户触发。

2. 核心算法逻辑

传统矩阵补全(如 SoftImpute、ALS)假设"大部分条目可观测",但电商session的页面转移矩阵天然稀疏——每个用户session只有35次页面跳转,导致采样概率 p = C/d(C≈25, d=页面类型数),绝大多数转移对从未被同一用户触发。

3. 业务应用场景

业务问题:母婴独立站有10种页面类型(HOME/SEARCH/CAT/PDP/CART/CHECKOUT/PAY/REVIEW/BLOG/SUPPORT),理论上有 10×10=100 个可能的转移组合。但实际数据中,大量转移组合从未被观测到(如 BLOG→PAY、SUPPORT→CHECKOUT)。问题是:这些转移真的不存在,还是样本太少没被捕捉到?

当前做法"观测为零就当零"会导致: - 桑基图有大量断线,视觉上路径"碎片化" - 无法识别低频但高价值路径(如 REVIEW→CART 的内容驱动购买) - 运营团队误判"某路径无效",放弃有潜力的优化方向

Hájek-GD 方案:在每行只有 3-5 个观测时仍能恢复完整矩阵,为桑基图提供"数据支撑的合理估计"而非"观测为零就当零"。

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

7. 代码模板

代码块数量:6 · 路径:未检测到

"""
Hájek-GD 超稀疏矩阵补全 - 完整实现
论文: One-Sided Matrix Completion from Ultra-Sparse Samples (arXiv:2601.12213)
应用: 母婴电商页面转移矩阵补全,支撑桑基图绘制

依赖: numpy, scipy, sklearn, pandas
"""

import numpy as np
import pandas as pd
from scipy.sparse import csr_matrix
from sklearn.metrics import mean_squared_error
from typing import Optional, Tuple, Dict, List
import warnings


# ─────────────────────────────────────────────────────────────
# 1. Hájek 估计器:从稀疏观测构建无偏二阶矩矩阵
# ─────────────────────────────────────────────────────────────

def compute_hajek_estimator(
    M_hat: np.ndarray,
    I: np.ndarray,
) -> Tuple[np.ndarray, np.ndarray]:
    """
    计算 Hájek 估计器 T̂ = M̂⊤M̂ / (I⊤I)(逐元素除法)

    Args:
        M_hat: (n, d) 稀疏观测矩阵,未观测位置为 0
        I:     (n, d) 二值掩码矩阵,观测到为 1,未观测为 0

    Returns:
        T_hat: (d, d) Hájek 估计的二阶矩矩阵(仅 Omega 集合内有效)
        Omega: (d, d) 布尔矩阵,True 表示该条目在 Omega 中(被至少一对共同观测)
    """
    # 计算 M̂⊤M̂:分子(各对页面的加权共现)
    numerator = M_hat.T @ M_hat  # (d, d)

    # 计算 I⊤I:分母(各对页面的共观测次数)
    denominator = I.T @ I  # (d, d)

    # Omega: 分母 > 0 的位置(至少有一次共观测)
    Omega = denominator > 0

    # Hájek 估计器:逐元素除法,Omega 外置 0
    T_hat = np.zeros((M_hat.shape[1], M_hat.shape[1]))
    T_hat[Omega] = numerator[Omega] / denominator[Omega]

    return T_hat, Omega


def compute_horvitz_thompson_estimator(
    M_hat: np.ndarray,
    I: np.ndarray,
    p: float,
) -> np.ndarray:
    """
    Horvitz-Thompson 估计器(对比基线):用真实采样概率 p 归一化

    Args:

8. 论文来源

  • 2601.12213