协同过滤的正确方法(这样的算法太简单了)

谈到推荐算法,协同过滤算法大名鼎鼎。相信很多人即使不熟悉推荐算法,也多少听过协同过滤这个词。今天我给大家讲解一个最简单的协同过滤算法实现思路,这个算法简单到只用加减乘运算就可以搞定,小学生都能理解。

在讲解之前我先来简单说明一下什么是协同过滤。所谓协同过滤,就是利用所有用户在某个APP(比如淘宝)上的操作行为,构建一个算法模型(即某种计算规则),为每个用户推荐他可能会感兴趣的物品。最终推荐的目的是提升用户体验,为平台方(如淘宝)创造商业价值。

我要讲解的最简单的协同过滤算法的流程如下图所示(这里以购买水果为例),主要包含3个步骤:第一步是构建每个用户的行为记录;第二步是根据协同操作行为获得物品的相关度;第三步是为某个用户计算推荐结果。这个协同过滤的实现思路是非常简单的,相信大家看看图就能大致理解。在我最早做推荐系统时就是采用的这个方法,很容易编程实现。下面我们分别按照上面的3步进行详细介绍。

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

图1:最简单的协同过滤算法的实现步骤

第一步:构建每个用户的行为记录

这一步是最简单的。每个用户的操作行为我们是可以通过埋点记录下来的,然后通过日志收集放到数据中心。我们只需要关注用户id、物品id、操作时间、操作行为(如点击、购买、播放时长等)这4个字段就可以了。

用户的行为是可以打分的,得分代表了用户对物品的喜好度。打分可以是基于人工规则的(也就是拍脑袋),也可以基于算法公式。比如购买可以打10分,加购物车打8分,收藏打6分,浏览打4分等。如果是物品是视频,那么可以根据播放完成度来打分,比如100分钟的视频,播放完了80分钟,那么就可以打8分(这里都是10分制)。

用户的行为可能是随时间变化的,我们可以给用户的每一次行为进行时间加权。也可以选择有限次的行为,比如只选择用户最近一段时间的行为(比如最近的一个月)或者选择用户最近若干次行为(比如最近的10次)。

根据上面的描述,一个用户 U 的行为记录可以记为:

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

这里

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

是用户有过操作行为的物品,

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

是对应的操作时间(按照先近后远来排列),

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

分别是用户 U 对物品

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

的评分。

通过上面的过程我们就获得了某个用户的行为记录了,其他用户的行为记录都可以按照类似的方式获得。

第二步:根据协同操作行为获得物品的相关度

有了用户在过去一段时间(比如过去一年)的所有行为记录,那么就很容易算出任何两个物品之间的关联度了。具体做法如下:

先将所有的物品组合成物品对(假设一共有某个物品,那么这样的对有

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

对,减去

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

是因为物品自己和自己不能组成一对),比如

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

,然后统计所有对

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

这两个物品有操作行为的用户。假设这样的用户有

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

个:

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

。用户

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

对物品

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

的评分分别为

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

(这个可以根据第一步获得)。那么

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

对的最终得分

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

可以用公式

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

计算得到。根据这个流程,我们可以获得所有的

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

对物品组合的得分(注意,其实我们的计算量可以减半,因为

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

=

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

),最终的结果可以记录为下表所示的形式。

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

获得了所有物品对的评分,就可以非常容易地对某个物品

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

,计算出与它关联的得分最高的

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

个物品了,这些物品称为与之最相关的物品(之所以每个物品只选择

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

个最相似的,是基于链两个考虑:一是其他的相似度很小了,相比这

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

个最相似的可以忽略了;二是只取

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

个可以减少计算和存储空间,因为一般来说物品的总数是很大的)。也就是从

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

中降序排列,选择

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

个得分最高的得分对应的物品就是与物品

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

最相关的物品。最终获得的结果可以用下表所示(下表中的

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

是两个物品根据表1获得的相似度)。

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

第三步:为某个用户计算推荐结果

有了一、二两步的准备,第三步就是为某个用户

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

做推荐了。假设某个用户的操作行为记录为

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

。那么这个用户对某个物品

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

的评分

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

可以按照如下公式计算:

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

上面公式中的

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

的具体计算方法为:如果

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

不在

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

最相似的

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

个物品集中(参见表2,可以获得每个

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

对应的最相似的

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

个物品集),那么

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

= 0,否则假设

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

,那么

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

=

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

当我们计算出了用户

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

对所有没有操作行为的物品集合(对于有操作行为的物品,根据用户的操作历史

这可能是最简单的协同过滤算法,只用加减乘运算就能搞定

,用户是有评分的)的评分,我们根据评分降序排列取TopN就可以获得给用的最终推荐结果。

这样,根据上面的一、二、三步,我们就可以为任何用户计算个性化推荐了。大家可以看到,上面的算法中完全只用了加减乘法,只要小学数学水平就可以理解(当然,为了通用性,我们采用了比较多的抽象符号来表示,对于没有太强抽象思维的读者,理解起来可能会觉得有点难度)。这个算法为某个用户计算推荐时,是用到了所有用户的行为的 (这在表2计算物品最相似的个物品时用到了),所以根据协同过滤算法的定义,这是一个协同过滤算法。

这个算法如果大家仔细思考,本质上其实就是item-based协同过滤(不了解的读者可以网上查一下,或者参考我之前写的「协同过滤推荐算法」这篇文章),只不过我们这里的讲解方法更容易理解(不需要采用矩阵等高等数学的思路去讲解,用矩阵讲解可能更简洁),这种思路也更容易利用Spark等分布式计算来实现。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
打赏 微信扫一扫 微信扫一扫

相关文章

发表评论

登录后才能评论

客服QQ: 8838832

客服微信