zoukankan      html  css  js  c++  java
  • 推荐算法之加权采样

    一、应用场景

      在基于用户兴趣召回物品时,每个用户都有兴趣标签,有时候可能兴趣标签非常多,每一个标签都有计算出来的权重,从高到底进行排序。在进行推荐的时候,我们到底基于哪些兴趣标签进行推荐呢,只选取topN的吗,还是全部?如果只选取topN的,那每次推荐结果都比较相似,而且权重低的兴趣标签似乎得不到推荐;如果按照全部标签进行推荐,可能计算量会非常大。

      这个时候可以加权采样方式筛选用户的兴趣标签,每次召回的不是全部兴趣标签,而是按照权重采样一部分标签进行召回,这样做的好处是显然的:

          1)减少召回的时间复杂度

          2)可以保留更多的标签

          3)每次召回计算都有所变化,满足了推荐多样性

          4)虽有变化,但依然受标签相对权重大小的约束

    在热门排行榜的展示中,也可以采用加权采样方法,比如热门展示位只有10个,那每次可以加权采样10个展示,刷新还有细微变化。

    所以,加权采样应该属于推荐系统中的技巧性方法,能够细微的改善用户的推荐结果,还是非常重要的。

    二、有限数据集的加权采样

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

    1. wi 是每个样本的权重,比如用户标签权重;
    2. R 是遍历每个样本时产生的 0 到 1 之间的随机数;
    3. Si 就是每个样本的采样分数

    三、无限数据集-蓄水池抽样

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

    蓄水池采样:

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

    这个过程,随时可以取用那 k 个集合作为输出结果,任意时刻,当总样本遍历了 n 个时,他们的概率都是 k/n 。这就是蓄水池采样,蓄水池采样,顾名思义,k 个元素的样本集合就是个蓄水池,是任意时刻的采样结果,可以随时取用。
     
    加权蓄水池采样:
    现在回到我们今天的主题来,实际上更需要的是加权蓄水池采样。加权蓄水池采样利用的依然是在前面说的第一种加权采样方法,只不过结合了蓄水池采样的思想:
    1、为每一个样本生成一个分数,分数还是采用上述si的计算公式。
    2、如果结果不足 k 个,直接保存到结果中。
    3、如果结果中已经有 k 个了,如果 Si 比已有的结果里最小那个分数大,就替换它。
     
    参考:《推荐系统三十六式》
  • 相关阅读:
    51nod 1004 n^n的末位数字
    51nod 1003 阶乘后面0的数量
    unity3d-多媒体与网络
    unity3d-代码控制游戏角色控制器移动
    unity3d-角色控制器续
    unity3d-物理引擎
    unity3d-碰撞检测
    unity3d-射线(Ray)
    unity3d-小案例之角色简单漫游
    unity3d-绘制贴图
  • 原文地址:https://www.cnblogs.com/gczr/p/11230774.html
Copyright © 2011-2022 走看看