推荐算法之加权采样
一、应用场景
在基于用户兴趣召回物品时,每个用户都有兴趣标签,有时候可能兴趣标签非常多,每一个标签都有计算出来的权重,从高到底进行排序。在进行推荐的时候,我们到底基于哪些兴趣标签进行推荐呢,只选取topN的吗,还是全部?如果只选取topN的,那每次推荐结果都比较相似,而且权重低的兴趣标签似乎得不到推荐;如果按照全部标签进行推荐,可能计算量会非常大。
这个时候可以加权采样方式筛选用户的兴趣标签,每次召回的不是全部兴趣标签,而是按照权重采样一部分标签进行召回,这样做的好处是显然的:
1)减少召回的时间复杂度
2)可以保留更多的标签
3)每次召回计算都有所变化,满足了推荐多样性
4)虽有变化,但依然受标签相对权重大小的约束
在热门排行榜的展示中,也可以采用加权采样方法,比如热门展示位只有10个,那每次可以加权采样10个展示,刷新还有细微变化。
所以,加权采样应该属于推荐系统中的技巧性方法,能够细微的改善用户的推荐结果,还是非常重要的。
二、有限数据集的加权采样
现在假设你有用户标签若干,每一个标签都有个权重 w,权重高低反映了用户对这个标签的感兴趣程度高低。你希望每次输出一部分标签用于召回推荐候选集,每次输出时都不一样,但是又能反映用户标签的权重,输出的概率和权重成正比,公式如下:
- wi 是每个样本的权重,比如用户标签权重;
- R 是遍历每个样本时产生的 0 到 1 之间的随机数;
- Si 就是每个样本的采样分数
三、无限数据集-蓄水池抽样
两种采样都是针对有限数据集的,也就是采样之前都要遍历一遍所有样本。那么如果面对的数据集无限大,或者不知道多大时,该怎么做加权采样呢?这就要讲到另一个采样算法了,名字叫蓄水池采样(也叫蓄水池抽样)。
蓄水池采样:
假如有一个数据集合,一共有 n 条,要从中采样取出 k 个,那么每个样本被选中的概率就是 k/n 。
蓄水池采样的做法是:
1.直接先取出前 k 个样本留着,这 k 个就是随时准备最终要输出的;
2.从第 k+1 个开始,每个都以 k/n 的概率去替换那留着的 k 个样本中的一个。
2.从第 k+1 个开始,每个都以 k/n 的概率去替换那留着的 k 个样本中的一个。
这个过程,随时可以取用那 k 个集合作为输出结果,任意时刻,当总样本遍历了 n 个时,他们的概率都是 k/n 。这就是蓄水池采样,蓄水池采样,顾名思义,k 个元素的样本集合就是个蓄水池,是任意时刻的采样结果,可以随时取用。
加权蓄水池采样:
现在回到我们今天的主题来,实际上更需要的是加权蓄水池采样。加权蓄水池采样利用的依然是在前面说的第一种加权采样方法,只不过结合了蓄水池采样的思想:
1、为每一个样本生成一个分数,分数还是采用上述si的计算公式。
2、如果结果不足 k 个,直接保存到结果中。
3、如果结果中已经有 k 个了,如果 Si 比已有的结果里最小那个分数大,就替换它。
参考:《推荐系统三十六式》