`

(转)One Class Collaborative Filtering 单类协同过滤

 
阅读更多

YangQiang教授指导的这篇ICDM2008的文章我2年前就拜读过,但当初对上面的方法不是特别感冒,所以也就没有记得特别清楚。最 近,KDD Cup的第二个track的问题和这篇Paper的研究问题很像,同时我在做KDD Cup时也设计了一个算法,感觉效果非常好,我准备把他称作基于采样的binarySVD算法。然后我准备研究一下这个算法是不是已经有人提出来了,因为 我隐约记得是看过类似的方法。结果我一查,发现果然是,标题里的那篇论文就是用的类似的方法,既然这个方法已经有人提出来了,我也就写篇博客再公开一下, 让更多人知道,哈哈。

废话不多说了。早期的推荐系统研究的问题就是评分预测,用户有一堆评分,然后弄出个模型,预测给定用户对给定item的评分。不过评分预测问题的解决无法实际应用。有2个原因:
1. 评分预测问题是说,我知道这个用户要对这个物品评分,然后问你他会评多少分。而实际系统的问题大多是,这个用户会对哪些物品评分?
2. 评分预测问题过度依赖评分数据,而很多网站记录的往往是用户的访问日志,比如视频网站中最多的数据是用户看了什么视频,而用户对视频打分的数据却非常少。

所以,实际系统中最重要的问题就是基于隐反馈的评分预测问题。所谓隐反馈,往往就是只有正样本。我们就拿视频网站说事,比如我们的数据就是,用户看了什么视频,然后让你预测用户还会看什么视频。

这个时候我们遇到一个问题,对于一个用户,我们有很样本是关于他看了什么视频,除了这些视频,剩下的视频是missing value,也就是说我们不知道他有没有看。不知道不代表用户没有看,也许用户在别的网站看了,也许用户在电视上看了。那么,这个时候对于我们在 Netflix比赛中很NB的SVD算法来说就出现了一个问题,没有负样本了。

没有负样本不代表不能做推荐,基于邻域的算法,比如基于Item的协同过滤(ItemCF)就可以在只有正样本的数据集上推荐。因为他的基本思想是 在正样本集合外画个比正样本集合稍微大一点的圈,然后推荐给用户那些和他们看过的视频相似的视频。但没有负样本却代表学习算法基本不work了,因为学习 算法大多是在正样本和负样本中间画一个分类面,那么没有负样本,自然也就没有分类面了。

所以,One Class Collaborative Filtering(OCCF)的思想就是我们要构造负样本

如何构造负样本是一个重点,这里我只介绍这篇文章中的方法,不谈也许更好的方法(等KDD Cup结束了可以谈,哈哈)。
1. 所有的missing value都是负样本(AMAU)
这是最自然想到的一个方法,不过这也是最烂的一个方法(这也是这篇文章中试图打败,并最终成功打败的一个算法)。这个方法有三点烂的。第一,因为 missing value非常多,造成数据规模非常大,因为我们知道一般推荐系统的数据集99%都是missing value。这样带来了无比高的复杂度,基本在大数据集上是不work的。第二,还是因为missing value非常多,造成负样本非常多,从而正负样本不平衡,这对学习算法也是很不利的因素。第三,missing value中有很多其实是正样本,只是我们不知道他们是正样本,如果把它们都归为负样本,会对精度带来负面影响。所以,这个算法理所当然的败下阵来,不过 这个算法是个不错的baseline算法,如果连这个方法都不如,就不要干了。

2. 采样负样本
终于到了本文的重点了。前面提到,AMAU的最大问题就是负样本太多了,造成复杂度太高。所以我们的一个想法就是,我们从missing value中采样出一个和正样本差不多大的集合作为负样本,就OK了。这个想法很朴素,但正是这个朴素的想法让SVD算法终于可以在OCCF的问题上和 ItemCF想媲美了。

但是missing value太多了,怎么采样呢,这篇文章介绍了3种方法
1. 均匀采样:这个想法最自然呢
2. 偏重用户采样:就是活跃度用户负样本也要多一点
3. 偏重item采样:不热门的item的负样本要多一点

最终文章的实验说,这三种采样策略,2好于1好于3。

得到负样本还没完,得到负样本之后我们可以构造出一个矩阵,里面有些元素是1,有些是-1,还有一些不知道。这个时候我们就可以用SVD来做预测了。这里还有一个重点,就是SVD是需要迭代的,那么我们需要在每次迭代的时候都进行重新采样。文中把这个称为bagging。

好了,就说到这儿了,其实上面的三种采样方法都不是最好的,将来再讨论更好的采样策略和优化策略。

分享到:
评论

相关推荐

    Exploit Latent Dirichlet Allocation for One-Class Collaborative Filtering

    单类协同过滤(OCCF)问题研究包括基于点的方法、基于对的方法和基于内容的方法。这些方法所做的基本假设大致相同,它们都将所有缺失值视为负值。然而,这并不合理,因为实际上缺失值是正面和负面示例的混合体。一个...

    网络游戏-科研社交网络中的单类协同过滤方法研究.zip

    单类协同过滤(Single-Class Collaborative Filtering,SCF)是一种在缺乏负面反馈或仅有正面评价的数据集上进行推荐的方法。在科研社交网络中,这种情境很常见,因为通常我们只能看到用户对某个研究领域或者合作...

    基于MapReduce的基于用户的协同过滤算法代码及其使用

    协同过滤算法是一种广泛应用在推荐系统中的技术,它可以分为用户基于用户的协同过滤(User-Based Collaborative Filtering, UB-CF)和物品基于用户的协同过滤(Item-Based Collaborative Filtering, IB-CF)两大类。...

    基于mahout的协同过滤算法实现

    协同过滤(Collaborative Filtering,简称CF)是一种基于用户行为的推荐方法,主要分为两种类型:用户-用户协同过滤和物品-物品协同过滤。前者通过找到与目标用户兴趣相似的其他用户,然后推荐他们喜欢的物品;后者...

    利用潜在的Dirichlet分配进行协作过滤

    在本文中,作者提出了利用潜在的Dirichlet分配(Latent Dirichlet Allocation,LDA)模型来解决单类协同过滤(One-Class Collaborative Filtering,OCCF)问题的方法。OCCF是推荐系统中的一项重要技术,它通过对用户...

    聚类下的协同推荐优化(python代码)

    其中: collaborative_filtering.py 是利用 协同预测 做矩阵填充的文件,生成predictedratings.dat cut_data.py 用来切割数据集 evaluate_cf.py 是早期用来测试 协同过滤 的文件 MovieGenres.py 文件是早期用来测试 ...

    使用Java创建音乐推荐引擎 - 一个实战教程

    public class CollaborativeFiltering { private MusicData musicData; public CollaborativeFiltering(MusicData data) { this.musicData = data; } // 计算用户间的相似度 private double similarity...

    斯坦福机器学习网页转pdf版本11-15.zip

    推荐系统的基本方法包括基于内容的过滤、协同过滤以及矩阵分解技术,如SVD++和BPR。此外,深度学习在推荐系统中的应用也越来越广泛,如神经网络推荐模型(Neural Collaborative Filtering)。 第14部分介绍了大规模...

    推荐系统实战——猜你喜欢推荐系统

    协同过滤(Collaborative Filtering, CF)算法是推荐系统的核心,其基本思想是利用用户的行为历史来预测其他用户可能的喜好。该算法分为两种主要类型:基于用户的协同过滤和基于商品的协同过滤。基于商品的协同过滤...

Global site tag (gtag.js) - Google Analytics