1 问题描述
这是2015年RecSys大会中的一篇文章,主要还是讲的Top-N推荐的应用,但是它的切入点是比较新颖的。在我们一般的认识中,我们会基于一个用户(同一个账号、userid等等)的历史行为去构建推荐系统,但是有时候同一个账号可能不代表就是同一个用户,例如一个家庭可能分享同一个账号购物,那么这样一来推荐结果的准确性就会被大幅度降低,甚至被认为是“无趣”的推荐,尤其是在我们不能准确掌握时间地点等上下文信息的情况下。试想,一个喜欢hip-hop的高中女生肯定不喜欢那些推荐给她喜欢传统音乐的母亲的推荐结果。文章要解决的问题就是在没有contextual information的情况下怎么去做共享账号的top-N推荐。
1.1 主要问题
这篇文章首先抛出了在分享账户的情况下会遇到的三个主要问题:
1.1.1 The dominance problem
在分享账户的情况下,推荐结果可能只会与其中的某几个人有关,而不是所有使用这个账户的人。例如,一个家庭中的人经常用这个账户购买一些生活用品,某次有个人给孩子买了一次玩具,但是当其下次再使用这个账户的时候,推荐结果推荐的基本还是那些生活用品。
1.1.2 The generality problem
由于推荐是根据所有这些使用这个账户的人的行为做的推荐,那么当不同的人有了不同的购买行为以后,推荐结果会泛化,导致的问题就是这些推荐跟所有人都有一点关系,但是对每一个人都没什么吸引力。
1.1.3 The presentation problem
如果推荐系统能为共享账号的每一个人做出精确推荐,那么推荐结果用什么方法展示给不同的人呢?
1.2 举例说明
那么如果我们使用传统的推荐算法做共享账号推荐就一定就会遇到上面提到的问题么?论文中列举了两个例子做出了解释,这里的比较算法就是传统的itemcf。
这里用户和使用同一个账户s。用户购买过、两件物品,用户购买过、、三件物品。、、、、是五件待推荐物品。、是适合推荐给用户的,、是适合推荐给用户的,而是一个中性的结果,对于两个用户来说都没有十分大的吸引力。每个table的左半部分列举出了物品之间的similarity,右半部分是对于一个用户来说每个物品的推荐得分。最后一列s代表的是把这个账户当做一个用户来看的话他的推荐得分。
Table1 解释了推荐结果泛化(generality)的问题。对于用户和来说,推荐给他们的分数最高的两个物品应该分别是和,但是当作为一个账户来看的时候,得分最高的却是。这恰恰就是因为几个相对平庸的得分的累加超过了最高得分所导致的。
Table2 说明了主导(dominance)问题。因为用户购买行为更多,所以推荐的结果中,这个用户占据了主导地位。当作为一个账户来做推荐的时候,推荐结果是偏向于的,这对用户来说是一种损害。
这两个图表还同时存在解释性(presentation)差的问题。例如在Table1中,对于账户s来说,物品的得分是11,这是由,,三部分组成的。但是在进行推荐解释时,对于用户来说,物品是其得分的组成之一是很奇怪的;而对于用户来说,这种推荐完全就被认为是一个错误的,不应该推荐给他的结果。
2 解决问题
2.1 传统itemcf算法
在传统的itemcf算法中我们通过计算物品之间的相似度,将与用户所选物品最相近的top-N个物品推荐给他。
2.2 解决generality problem
这里超参数p的取值是在[0,1]。p主要就是影响了购买物品数量有差异的用户在做推荐时候的比重。直观上来看,这个公式的意思是,购买物品越多的人,他对评分的影响和购买物品少的人对评分的影响的比重会随着p的增大而减小;换句话说,买的少的人可以随着通过调整p变大来增加自己的权重。p越大,偏差越大,鲁棒性也就越强。
由于我们解决generality问题的目标就是找到那个和某个用户强相关的物品并且最终推荐出来,所以这里我们会针对每个用户计算其与这件物品的相关得分,选取最大的那个分数作为最终得分。
但是很不幸的一点是,我们通常不知道在共享账户中,某个物品到底是被哪个用户购买的,只知道一个账户的整体行为。所以,这里提出了一个近似方案,
是I(a)的全集。即,我们使用这个上限值来做近似估算。因为I(a)包含了所有的I(u)的组合。基于此,这里提出了disambiguating item-based (DAMIB)recommender system
所以,为了计算最优解,首先要选取最优子集。
选取的时间复杂度是指数级别的。这会给未来的计算带来很大麻烦。
这段主要就是论证了如何在O(nlogn)的时间复杂度下找到最优。基本意思就是先将所有物品按照其与要推荐产品的相关性做一个排序,当为一个待推荐产品选取其subset的时候,我们先初始化这个subset(如何初始化这里作者并没有说明,其实任何方法都可以,例如random)我们不断的将这个subset中rank值低的剔除然后把rank值最高的那个并且还没有在这个subset中的物品加入。这样一来便大大降低了计算的时间复杂度(此时的复杂度等同于一个排序算法的复杂度)。
2.3 解决dominance problem
在上面提到的DAMIB算法中,如果最终我们得到的关于每一个物品推荐的最优subset集合只是来自于I(a)中的一小部分,那么我们可以说这个推荐结果是存在dominance问题的。为了解决这个问题,作者提出了DAMIB-COVER 算法。这个方法的基础是当我们发现用于选取top-N推荐结果的其中一个最优子集与top-N中其他最优子集的合集没有达到一定的差异性时,我们将从top-N中剔除这个推荐结果。即:
2.4 解决presentation problem
在推荐结果的展现问题上,作者还是借用了之前选取最优子集的策略。当把所有的top-N结果展示出来的时候,给每一个结果都标注上其是从哪个子集得来的。换句话说,也就是当一个物品r被推荐出来的时候,我们的推荐理由是因为某个用户之前选择了s1、s2、s3三个物品,而恰恰在使用这个账户的某个用户之前确实选择了s1、s2、s3,这样他就可以知道r是推荐给他的了。
作者在试验环节展示了这种方法的表现,结果还是比较令人惊讶的。60%的用户可以做到完全匹配。虽然如此,我对这里还是比较有疑虑,不知道是否不同数据集都能表现出类似的效果。
3 DAMIB-COVER 算法在数据集上的表现
作者在Yahoo!Music,Movielens1M,Book-Crossing,the Wiki10+等多个数据集做了新算法与标准itemcf推荐算法的比较,最终得到结论,新算法在共享账户的情况下的推荐效果要明显优于传统算法,且其在单用户(非共享)推荐的场景中也有着和标准itemcf算法不相上下的能力。
具体试验效果请参考直接论文:
http://win.ua.ac.be/~adrem/bibrem/pubs/verstrepen15sharedaccounts.pdf
算法的代码实现以及具体数据集:
https://bitbucket.org/BlindReview/rsa
编后语:这篇文章可以说是很贴近实际而且是很前沿的。在推荐领域,共享账户的推荐问题还没有被完全重视起来,尤其是在国内的互联网公司中,大家做的更多的还是基于单用户的推荐,或者是基于group的推荐。其实,无论是电商领域、应用商店还是社交网络中,共享账户的现象是普遍存在的。这篇文章开启了一个新的课题,希望今后有更多相关的应用案例与研究出现。另外,文章中一些解决问题的思路也值得借鉴,例如在计算每一个待推荐物品的时候都可以将原来物品集中的物品按照其与这个待推荐物品的相关性做排序以找到最优子集;还有为了解决dominance问题而用top-N中的一个物品与剩余物品集做距离检测,以扩大推荐范围等等。这些都是很好的很贴近实际的解决问题的方法。