作者 | gongyouliu

 

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

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

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_python

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

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

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

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

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

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

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_02

这里 

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_03

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_04

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_05

分别是用户 U 对物品 

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_06

的评分。

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

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

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

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_07

对,减去

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_08

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_算法_09

,然后统计所有对

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_10

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_11

个:

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_12

。用户

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_13

对物品

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_14

的评分分别为

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_15

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_16

对的最终得分

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_17

可以用公式

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_18

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_19

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_20

=

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_21

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

物品组合(一共m个物品)

一段时间之内用户对物品的评分之和

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_算法_22

                      

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_23

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_24

                      

协同过滤 属于机器学习吗 协同过滤算法难学吗_算法_25

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_算法_26

                      

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_27

......

                       ......

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_28

                       

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_29

......

                        ......

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_算法_30

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_31

表1:两个物品组合及其评分

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_32

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_33

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_34

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_35

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_36

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_37

中降序排列,选择

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_38

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_39

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_40

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

物品

与该物品最相关的

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_41

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_42

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_算法_43

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_44

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_45

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_46

......

......

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_47

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_48

......

......

 

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_49

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_50

表2:某个物品最相似的个物品列表

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

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_51

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_52

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_53

的评分

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_54

可以按照如下公式计算:

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_55

上面公式中的

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_56

的具体计算方法为:如果

协同过滤 属于机器学习吗 协同过滤算法难学吗_算法_57

不在

协同过滤 属于机器学习吗 协同过滤算法难学吗_算法_58

最相似的

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_59

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_60

对应的最相似的

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_61

个物品集),那么

协同过滤 属于机器学习吗 协同过滤算法难学吗_推荐系统_62

 = 0,否则假设

协同过滤 属于机器学习吗 协同过滤算法难学吗_人工智能_63

,那么

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_64

 =

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_65

。当我们计算出了用户

协同过滤 属于机器学习吗 协同过滤算法难学吗_协同过滤 属于机器学习吗_66

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

协同过滤 属于机器学习吗 协同过滤算法难学吗_python_67

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

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