推荐系统三十六式学习笔记:原理篇.其他应用技术22|实用的加权采样算法

目录

  • 一些场景:
  • 加权采样
    • 1.有限数据集
    • 2.无限数据集
  • 总结

今天给大家讲一下加权采样算法,看似和推荐系统没什么关系,但肯定有用,只是在别的推荐系统相关话题里少有人提及。

一些场景:

想象一个场景:你经过千辛万苦抓数据,清洗数据,收集用户行为,目的就是给用户计算兴趣标签。

这时候你会遇到一个两难的问题:如果给用户计算出兴趣标签的权重了,那应该保留多少标签呢?保留太多的话,每次召回候选集时,计算复杂度可不低,只保留部分吧,手心手背都是肉,生怕丢弃的标签才是用户的真爱。

这时你需要一个简单的加权采样算法,每次召回时并不用全部用户标签,而是按照权重采样一部分标签来使用,这样做的好处当然很明显:
1.大大减少召回时的计算复杂度;
2.可以保留更多的用户标签;
3.每次召回计算时还能有所变化;
4.虽然有变化,但是依然受标签的权重相对大小约束。

加权采样的应用不只是这一个地方,比如在热门排行榜展示时,也可以用加权采样,而不仅仅按照排行榜分数顺序展示,采用加权加权采样的展示方法,会让排行榜每次刷新都略有变化,人们也会更加喜闻乐见。

下面介绍几种常用的加权采样算法及其原理,供你使用。

加权采样

加权采样有两种情况,一种是已知全部样本的个数。这需要遍历整个样本,比如用户标签采样输出,那么每次采样时仍然需要遍历所有的标签,来依次决定每一个标签输出的概率。另一种情况是不知道样本总量是多大,或者总量很大,以至于你不愿意全部遍历之后再输出采样结果,这样的数据就是数据流,对应的就是流采样。

下面分别讲这两种采样方法:

1.有限数据集

现在假设你有用户标签若干,每一个标签都有个权重w,权重高低反映了用户对这个标签的感兴趣程度高低。你希望每次输出一部分标签用于召回推荐候选集,每次输出时都不一样,但又能反映用户标签的权重,输出的概率和权重成正比。

这时你需要一个公式:
S i = R 1 w i S_i =R^{\frac{1}{w_i}} Si=Rwi1

其中各元素意义如下:
1.w_i是每个样本的权重,比如用户标签权重;
2.R是便签里每个样本时产生的0到1之间的随机数;
3.S_i就是每个样本的采样分数

遍历之后,按照采样分数排序,输出前k个结果就是得到的采样结果。可以简单做个模拟,比如下面有这样几个简单样本。

样本权重
a0.4
b0.1
c0.5

模拟1000次后,三个样本被采样次数如下

样本权重次数
a0.44025
b0.11024
c0.54935

可以看出每个样本采样概率和它的权重成正比。

还有一种加权采样方法,是利用指数分布。

指数分布的概率密度函数是:
f ( x , λ ) = { λ e − λ x , x = 0 0 , x < = 0 f(x,λ) =\begin{cases} λe^{-λx},\quad x= 0\\ 0, \quad x<=0 \end{cases} f(x,λ)={λeλx,x=00,x<=0

指数分布的参数 λ \lambda λ,它的倒数, 1 λ \frac{1}{\lambda} λ1就是事件发生时间间隔的期望。把指数分布的这个意义放进标签中来考虑,标签的权重其实反映一个直觉:
权重越大的标签,用户消费它就越频繁,也就是时间间隔就会短。

所以根据这个原理,就有另一个加权采样的办法:为每一个标签构造一个指数分布随机数,这个指数分布的参数 λ \lambda λ就是标签权重,然后用这个指数分布产生一个随机数,再输出随机数最大的k个标签作为采用结果。

还是上面的权重,再来模拟10000次。

样本权重次数
a0.43993
b0.1980
c0.55027

依然完美符合权重的相对大小。

2.无限数据集

上面的两种采样都是针对有限数据集的,也就是采样之前都要遍历一遍所有样本。那么如果面对的数据集无限大,或者不知道多大时,该怎么做加权采样呢?这就要讲到另一个采样算法了,叫蓄水池采样(也叫蓄水池抽样)。

蓄水池采样可以用在推荐系统的哪些地方呢?比如可以在模型融合之后加一层蓄水池抽样,或者在召回阶段加一层蓄水池采样,这样在不影响整个推荐流程和转化概率的前提下,降低计算复杂度和提升推荐多样性。

或者,在线阶段要使用用户的反馈行为做实时推荐,对于不同的用户,活跃程度不同,产生的反馈行为数量不同。你也可以用蓄水池采样,为每个用户取出固定数量的行为用于更新推荐结果。

下面,我先讲蓄水池采样,再讲加权蓄水池采样。

假如有一个数据集合,一共有n条,要从中采样取出k条,那么每个样本被选中的概率就是 k n \frac{k}{n} nk.蓄水池采样的做法是:
1.直接先取出前k个样本留着,这k个就是随时准备最终要输出的;
2.从第k+1个开始,每个都有 k n \frac{k}{n} nk的概率去替换那留着的k个样本中的一个。

这个过程,随时可以取用那k个集合作为输出结果,任意时刻,当总样本遍历了n个时,它们的概率都是\frac{k}{n}。这就是蓄水池采样,蓄水池采样,顾名思义,k个元素的样本集合就是蓄水池,是任意时刻的采样结果,可以随时取用。

现在回到我们今天的主题来,实际上更需要的是加权蓄水池采样。加权蓄水池采样利用的依然是在前面说的第一种加权采样方法,只不过结合了蓄水池采样的思想。

要从大数据集中采样k个,其具体做法是这样的:
1.为每一个样本生成一个分数,分数还是用这个公式 S i = R ( 1 w i ) S_i =R^{(\frac{1}{w_i})} Si=R(wi1)
2.如果结果不足k个,直接保存到结果中。
3.如果结果中已经有k个了,如果 S i S_i Si比已有的结果里最小那个分数大,就替换它。

总结

今天介绍的算法非常简单,但是在推荐系统中有很多的用途。尤其是面对数据需要采样,需要有所变化时,加权采样本质上来说就是让权重影响采样概率。

前面的几种加权采样算法,都是让采样概率和权重成正比,这意味着你的样本全转给你之间的关系要合理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值