作者 | gongyouliu
谈到推荐算法,协同过滤算法大名鼎鼎。相信很多人即使不熟悉推荐算法,也多少听过协同过滤这个词。今天我给大家讲解一个最简单的协同过滤算法实现思路,这个算法简单到只用加减乘运算就可以搞定,小学生都能理解。
在讲解之前我先来简单说明一下什么是协同过滤。所谓协同过滤,就是利用所有用户在某个APP(比如淘宝)上的操作行为,构建一个算法模型(即某种计算规则),为每个用户推荐他可能会感兴趣的物品。最终推荐的目的是提升用户体验,为平台方(如淘宝)创造商业价值。
我要讲解的最简单的协同过滤算法的流程如下图所示(这里以购买水果为例),主要包含3个步骤:第一步是构建每个用户的行为记录;第二步是根据协同操作行为获得物品的相关度;第三步是为某个用户计算推荐结果。这个协同过滤的实现思路是非常简单的,相信大家看看图就能大致理解。在我最早做推荐系统时就是采用的这个方法,很容易编程实现。下面我们分别按照上面的3步进行详细介绍。
图1:最简单的协同过滤算法的实现步骤
第一步:构建每个用户的行为记录
这一步是最简单的。每个用户的操作行为我们是可以通过埋点记录下来的,然后通过日志收集放到数据中心。我们只需要关注用户id、物品id、操作时间、操作行为(如点击、购买、播放时长等)这4个字段就可以了。
用户的行为是可以打分的,得分代表了用户对物品的喜好度。打分可以是基于人工规则的(也就是拍脑袋),也可以基于算法公式。比如购买可以打10分,加购物车打8分,收藏打6分,浏览打4分等。如果是物品是视频,那么可以根据播放完成度来打分,比如100分钟的视频,播放完了80分钟,那么就可以打8分(这里都是10分制)。
用户的行为可能是随时间变化的,我们可以给用户的每一次行为进行时间加权。也可以选择有限次的行为,比如只选择用户最近一段时间的行为(比如最近的一个月)或者选择用户最近若干次行为(比如最近的10次)。
根据上面的描述,一个用户 U 的行为记录可以记为:
这里
是用户有过操作行为的物品,
是对应的操作时间(按照先近后远来排列),
分别是用户 U 对物品
的评分。
通过上面的过程我们就获得了某个用户的行为记录了,其他用户的行为记录都可以按照类似的方式获得。
第二步:根据协同操作行为获得物品的相关度
有了用户在过去一段时间(比如过去一年)的所有行为记录,那么就很容易算出任何两个物品之间的关联度了。具体做法如下:
先将所有的物品组合成物品对(假设一共有某个物品,那么这样的对有
对,减去
是因为物品自己和自己不能组成一对),比如
,然后统计所有对
这两个物品有操作行为的用户。假设这样的用户有
个:
。用户
对物品
的评分分别为
(这个可以根据第一步获得)。那么
对的最终得分
可以用公式
计算得到。根据这个流程,我们可以获得所有的
对物品组合的得分(注意,其实我们的计算量可以减半,因为
=
),最终的结果可以记录为下表所示的形式。
物品组合(一共m个物品) | 一段时间之内用户对物品的评分之和 |
| |
| |
| |
...... | ...... |
| |
...... | ...... |
|
表1:两个物品组合及其评分
获得了所有物品对的评分,就可以非常容易地对某个物品
,计算出与它关联的得分最高的
个物品了,这些物品称为与之最相关的物品(之所以每个物品只选择
个最相似的,是基于链两个考虑:一是其他的相似度很小了,相比这
个最相似的可以忽略了;二是只取
个可以减少计算和存储空间,因为一般来说物品的总数是很大的)。也就是从
中降序排列,选择
个得分最高的得分对应的物品就是与物品
最相关的物品。最终获得的结果可以用下表所示(下表中的
是两个物品根据表1获得的相似度)。
物品 | 与该物品最相关的 |
| |
| |
| |
...... | ...... |
| |
...... | ...... |
|
表2:某个物品最相似的个物品列表
第三步:为某个用户计算推荐结果
有了一、二两步的准备,第三步就是为某个用户
做推荐了。假设某个用户的操作行为记录为
。那么这个用户对某个物品
的评分
可以按照如下公式计算:
上面公式中的
的具体计算方法为:如果
不在
最相似的
个物品集中(参见表2,可以获得每个
对应的最相似的
个物品集),那么
= 0,否则假设
,那么
=
。当我们计算出了用户
对所有没有操作行为的物品集合(对于有操作行为的物品,根据用户的操作历史
,用户是有评分的)的评分,我们根据评分降序排列取TopN就可以获得给用的最终推荐结果。
这样,根据上面的一、二、三步,我们就可以为任何用户计算个性化推荐了。大家可以看到,上面的算法中完全只用了加减乘法,只要小学数学水平就可以理解(当然,为了通用性,我们采用了比较多的抽象符号来表示,对于没有太强抽象思维的读者,理解起来可能会觉得有点难度)。这个算法为某个用户计算推荐时,是用到了所有用户的行为的 (这在表2计算物品最相似的个物品时用到了),所以根据协同过滤算法的定义,这是一个协同过滤算法。