超稀疏矩阵补全 - 每行仅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