多维度数据统一线性处理的常见方案
先说业务背景吧
- 这是一个类似于「番茄小说」的项目,要做用户的首页推荐列表
- 数据源是小说的SubscribeNum(总订阅量)、SearchNum(总搜索量)、WeekSubNum(最近一周订阅量)、MonthSubNum(最近一个月订阅量)
- 如何设计计算小说的热度分数才能使这四个维度精准地表达自身影响力,而不被绝对量级绑架?
再来进行具体分析
可以肯定的是,直接将四个字段值相加作为热度分数是不行的。
这里详细分析一下原因,知其然知其所以然嘛😁:
直接相加会出现以下问题:
- 1. 四个字段的“单位”虽然都是“次数”,但它们的统计口径不同:
- SubscribeNum、SearchNum:全生命周期累积量,随时间单调递增,量纲是“总量”。
- WeekSubNum、MonthSubNum:最近 7 天 / 30 天的增量,量纲是“速率”。
- 直接相加相当于把“总路程”与“瞬时速度”混为一谈,物理意义不一致。
- 2. 数值范围差异巨大(尺度问题):
设某头部小说:SubscribeNum = 10 000 000SearchNum = 5 000 000WeekSubNum = 10 000MonthSubNum = 40 000直接相加:score = 10 000 000 + 5 000 000 + 10 000 + 40 000 = 15 050 000
其中 WeekSubNum 仅占 0.066%,几乎被淹没;任何小说的分数都由 SubscribeNum 主导(且与订阅榜冲突),WeekSubNum 与 MonthSubNum 对排序结果的影响趋近于 0。
- 3. 分布长尾导致权重失衡
累积量呈幂律分布:
- 90% 小说的 SubscribeNum < 100 000
- 1% 头部 > 10 000 000
直接相加后,分数分布同样呈幂律:
- 头部小说:15 000 000 ± 1%
- 腰部小说:100 000 ± 1% 相对差距被放大,排序结果几乎等价于“按 SubscribeNum 排序”,失去了多维度融合的意义。
一句话总结:直接相加会把不同尺度、不同分布、不同含义的数值强行叠加,结果被最大量级的字段垄断,其他维度失去话语权,从而无法反映“综合热度”。
这类问题属于 “特征尺度统一(Feature Scaling / Normalization)”,目标是把不同量纲、不同分布、不同取值范围的原始指标转换成 “可比、可加、权重可控” 的数值表示,使每个维度都能精准地表达自身影响力,而不被绝对量级绑架。
如何解决这类 特征尺度统一问题呢?
业界已经有非常成熟的方案了,常见方案、优缺点与适用场景:
(了解即可,表格是 AI 给的)
方案 | 数学公式 | 优点 | 缺点 | 适用场景 |
Min-Max 归一化 | (x−min)/(max−min) | 简单、可解释、保序 | 对异常值敏感、需定期更新 min/max | 分布有界、无极端离群 |
Z-Score 标准化 | (x−μ)/σ | 对异常值鲁棒、无量纲 | 结果可负,不易解释 | 近似正态或需机器学习 |
Log / Log1p 变换 | log(x) | 压缩长尾、保序 | 不能处理零值、需平移 | 幂律/长尾分布 |
RobustScaler | (x−median)/IQR | 对极端异常值极鲁棒 | 不保证固定区间 | 离群点多、数据脏 |
Box-Cox / Yeo-Johnson | 幂变换族 | 可矫正偏态、近似正态 | 需拟合 λ,复杂 | 统计建模、ML 特征 |
Ranking / 分位数桶 | 先排序再分桶 | 完全消除量纲、保序 | 信息损失、不可微 | 排序类业务、解释性要求低 |
时间衰减权重 | x·e^(−λΔt) | 直接建模时效性 | 需调 λ | 强时间敏感场景 |
向量归一化 | x/‖x‖ | 保留方向、用于相似度 | 结果非线性、难解释 | 文本、Embedding |
这里重点结合 Log1p 变换+Min-Max 归一化 两种方案解决当下问题(其他方案不涉及哟)
分析解决业务需求
先来看看我们的业务特点:
- 1. 累积量(SubscribeNum、SearchNum)呈幂律长尾;
- 2. 时效量(WeekSubNum、MonthSubNum)相对平稳;
- 3. 需要可解释、可实时更新、可人工调权。
因此采用 “Log1p + Min-Max 归一化 + 加权融合”。
- 1. SubscribeNum、SearchNum:
- 处理方式:log1p(x) → Min-Max → [0,1]
- 理由:先压缩长尾,再线性映射,兼顾可解释与抗异常
- 2. WeekSubNum、MonthSubNum:
- 处理方式:Min-Max → [0,1]
- 理由:本身范围可控,无需对数
- 3. 融合:
- 处理方式:score = Σ w_i·norm_i(就是求 4 个字段 归一化后的值与权重的乘积 之和)
- 理由:权重可人工或 A/B 调参,结果直观
因为这四个字段是已经落地到数据库中的,不需要实时计算,所以实现方法很简单,直接定时任务查询每本小说的字段信息然后计算热度值即可。
完结🎉