思想:来源于传统的 CF:
- 如果多个 user 都只共同点了 i1 和 i2,那么其一定是强关联的,这种关联是通过用户来传递的;
- 如果两个 user pair 对之间构成的 swing 结构越多,则每个结构越弱,在这个 pair 对上每个节点分到的权重越低。
1 原理
Swing
意为摇摆或者秋千,它是基于图结构的一种实时推荐算法。主要公式为:
结合前面的思想,公式表达的就是为了衡量物品 i 和 j 的相似性
:考察都购买了物品 i 和 j 的用户 u 和 v, 如果这两个用户共同购买的物品越少,则物品 i 和 j 的相似性越高。
极端情况下,两个用户都购买了某个物品,且两个用户所有购买的物品中,共同购买的物品只有这两个,说明这两个用户兴趣差异非常大,然而却同时购买了这两个物品,则说明这两个物品相似性非常大!
区别:icf
:如果喜欢两个物品的交集用户越多,那么这两个物品间的相似度越高。swing
:如果同时喜欢两个物品的用户越多,且这些用户之间的重合度越低,那么这两个物品间的相似度越高。
2 计算步骤
在实际中计算的时候主要分为以下3步:
step0:计算用户的权重$w_u$
其中:
- $k$:平滑作用的超参数,可根据具体业务效果确定,比如 5;
- $\alpha$:权重因子,越大对高活用户降权越狠,常用 0.35。
主要为了通过用户的行为数来衡量兴趣的分散度,从而给定用户行为 item 的权重。
注意在统计 clkcnt 的时候是不去重的。
step1:计算用户pair的权重
对于点击同 item 的每个 (u1,u2)
的 pair 对,其权重系数:
stpe2:计算相似度
对于有被 (u1,u2)
用户 pair 对共同正反馈的 item pair 对(i,j)
来说,其相似分:
其中 intersection
代表每一个用户 pair 对(u1,u2)
的共同正行为 item 个数。
此处,分母中的 1 也是一个可调参数。
并且,分母中可以再引入一些权重参数,例如:
- 两个用户对左右 item pair 的类目权重;(session内 当前类目点击数/全部类目点击数)
- user 与 item 之间的连接数作为权重;
3 相关经验
这里披露部分实践中可能需要注意的模块。
1. 用户的筛选
主要为了保障数据的置信度,需要选择相对正常且行为有参考价值的用户。比如,行为数过少/过多的剔除,当然具体操作还是要结合业务逻辑。
2. 物料的筛选
也是出于同样的目的,当然这里是否操作的影响可能小一些。比如,物料的 pair 对过少的是否排除。
3. 简化计算
因为这里的 pair 是双向等价的,即 $(i1,i2)$ 和 $(i2,i1)$ 的相似度应该的相同。所以不论是 user 还是 item 的 pair 对,往往只需要构建单向的,最后构建倒排的时候,所有 $(i2,i1)$ 复用 $(i1,i2)$ 的相似度即可。
4. 增量更新
与很多召回算法一样,不论更新频率是多少(by day/hour 等),都需要考虑和历史数据合并的问题。这里也是类似的,可以将所有的 pair 先做增量合并,然后按照时间步数衰减合并新老相似度分,分数过低的可以选择截断淘汰。
参考文章:
【召回】swing 算法
一文看懂推荐系统:召回02:Swing 模型