![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/02e2671771512c88682057e0f3f25d27.jpeg)
作者丨gongyouliu
来源 | 大数据与人工智能
导语:本文会从协同过滤思想简介、协同过滤算法原理介绍、离线协同过滤算法的工程实现、近实时协同过滤算法的工程实现、协同过滤算法应用场景、协同过滤算法的优缺点、协同过滤算法落地需要关注的几个问题等7个方面来讲述。希望读者读完本文,可以很好地理解协同过滤的思路、算法原理、工程实现方案,并且具备基于本文的思路自己独立实现一个在真实业务场景中可用的协同过滤推荐系统的能力。
一、协同过滤思想简介
二、协同过滤算法原理介绍
上面一节简单介绍了协同过滤的思想,基于协同过滤的两种推荐算法,核心思想是很朴素的”物以类聚、人以群分“的思想。所谓物以类聚,就是计算出每个标的物最相似的标的物列表,我们就可以为用户推荐用户喜欢的标的物相似的标的物,这就是基于物品(标的物)的协同过滤。所谓人以群分,就是我们可以将与该用户相似的用户喜欢过的标的物的标的物推荐给该用户(而该用户未曾操作过),这就是基于用户的协同过滤。具体思想可以参考下面的图1。
协同过滤的核心是怎么计算标的物之间的相似度以及用户之间的相似度。我们可以采用非常朴素的思想来计算相似度。我们将用户对标的物的评分(或者隐式反馈,如点击、收藏等)构建如下用户行为矩阵(见下面图2),矩阵的某个元素代表某个用户对某个标的物的评分(如果是隐式反馈,值为1),如果某个用户对某个标的物未产生行为,值为0。其中行向量代表某个用户对所有标的物的评分向量,列向量代表所有用户对某个标的物的评分向量。有了行向量和列向量,我们就可以计算用户与用户之间、标的物与标的物之间的相似度了。具体来说,行向量之间的相似度就是用户之间的相似度,列向量之间的相似度就是标的物之间的相似度。 为了避免误解,这里简单解释一下隐式反馈,只要不是用户直接评分的操作行为都算隐式反馈,包括浏览、点击、播放、收藏、评论、点赞、转发等等。有很多隐式反馈是可以间接获得评分的,后面会讲解。如果不间接获得评分,就用0、1表示是否操作过。 在真实业务场景中用户数和标的物数一般都是很大的(用户数可能是百万、千万、亿级,标的物可能是十万、百万、千万级),而每个用户只会操作过有限个标的物,所以用户行为矩阵是稀疏矩阵。正因为矩阵是稀疏的,会方便我们进行相似度计算及为用户做推荐。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/de1730fede65a7984af7d35b9edcf1e0.png)
相似度的计算可以采用cosine余弦相似度算法来计算两个向量
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/301ebd6e6f612d013091c3835fadc215.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/aa1515569a2b3e86ceaa280dc5da3aa6.png)
计算完了用户(行向量)或者标的物(列向量)之间的相似度,那么下面说说怎么为用户做个性化推荐。
2.1 基于用户协同过滤
根据上面算法思想的介绍,我们可以将与该用户最相似的用户喜欢的标的物推荐给该用户。这就是基于用户的协同过滤的核心思想。
用户u对标的物s的喜好度sim(u,s)可以采用如下公式计算,其中U是与该用户最相似的用户集合(我们可以基于用户相似度找到与某用户最相似的K个用户),
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/40e6d9c9736ea390f236bc441f86af63.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/38d86ff9976424200d3a94fc7fea28c6.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/f9d53584fd99fc337f98eee931cc737e.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/38d86ff9976424200d3a94fc7fea28c6.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/b73daa3a1fc674fc6c7c1090df9c91db.png)
类似地,通过将用户操作过的标的物最相似的标的物推荐给用户,这就是基于标的物的协同过滤的核心思想。 用户u对标的物s的喜好度sim(u,s)可以采用如下公式计算,其中S是所有用户操作过的标的物的列表,
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ac61cf318b3094f3c73c552ef9a3335e.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/595e73bb144f52a00aafbf6c21df698b.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/c0e921bfd1d6252b571d3f2f99d93135.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/595e73bb144f52a00aafbf6c21df698b.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/8663aea83035e4f8a3b2ae99668b8963.png)
三、离线协同过滤算法的工程实现
虽然协同过滤算法原理非常简单,但是在大规模用户及海量标的物的场景下,单机是难以解决计算问题的,我们必须借助分布式技术来实现,让整个算法可以应对大规模数据的挑战。在本节,我们基于主流的Spark分布式计算平台相关的技术来详细讲解协同过滤算法的离线(批处理)实现思路,供大家参考(读者可以阅读参考文献1、2、3、4了解协同过滤算法原理及工业应用),同时会在下一节讲解在近实时场景下怎么在工程上实现协同过滤算法。 在这里我们只讲解基于标的物的协同过滤算法的工程实现方案,基于用户的协同过滤思路完全一样,不再赘述。 为了简单起见,我们可以将推荐过程拆解为2个阶段,先计算相似度,再为用户推荐。下面分别介绍这两个步骤怎么工程实现。 3.1 计算topK相似度
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9b11e35ceb16724a34b70f1521d3e53e.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9ac32f7a5f502f28178314549814e784.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3ff517405c2c540a945a9a3a0a489c2d.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9b11e35ceb16724a34b70f1521d3e53e.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/dd2d896b0b14b54cbc561810a29219a7.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9b11e35ceb16724a34b70f1521d3e53e.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/6d7b1fe66f4ed494d7f0d6dfb6a7f431.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/f62a863c1f745d9059c63a84b7f81cc2.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/f62a863c1f745d9059c63a84b7f81cc2.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/6ea2d7747cfbd5c942aea04e10bf767d.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/f39a21bf65d31caa5b07c94609207364.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9b11e35ceb16724a34b70f1521d3e53e.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9b11e35ceb16724a34b70f1521d3e53e.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9f9c0a7023598581c31412ef82212135.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/22685d8125d9ed37aa72c29a5fa79c7b.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/00e9c37c4b03ec3ba4f9cddb8b153730.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d9f3787c2d76a20d58c176cfc17f91f5.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/2d9ab9854eaed45278c580bbe2278426.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/664b12b27aa49963f0084fb86e06390f.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/e1b0496f2169203113434cdbd9fc9370.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d9f3787c2d76a20d58c176cfc17f91f5.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d9f3787c2d76a20d58c176cfc17f91f5.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9287c6ba22ff08b882a1e6e7c91e9583.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9b11e35ceb16724a34b70f1521d3e53e.png)
通过上面这些步骤,公式1中的分子和分母基本都很容易计算出来了,我们通过下图的代码(下面的broadcast即是
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/c4771d88aaecc8b5947b0412eecc89c9.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9b11e35ceb16724a34b70f1521d3e53e.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/c80c79dd83e6a724e99a53c499776a9d.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ffea1cc24d331977125653120f891543.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9b11e35ceb16724a34b70f1521d3e53e.png)
有了上面的准备,下面我们来说明一下怎么计算每个标的物的topK最相似的标的物。 具体的计算过程可以用如下的Spark Transformation来实现。其中第三步的TopK需要我们自己实现一个函数,求
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/f5790896c718ef76fb7c7dd7350e3ab3.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/c3c0b94f7825750d92b43aa6955ebad7.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3559ec0742fb28b39e0c92ed013e7603.png)
到此为止,我们通过Spark提供的一些Transformation操作及一些工程实现上的技巧计算出了每个标的物topK最相似的标的物。该计算方法可以横向拓展,所以再大的用户数和标的物数都可以轻松应对,最多可能需要多加一些服务器。 3.2 为用户生成推荐
有了1中计算出的标的物topK最相似的标的物,下面我们来说明一下怎么为用户生成个性化推荐。生成个性化推荐有两种工程实现策略,一种是看成矩阵的乘积,另外一种是根据第二节2中”基于标的物的协同过滤“中的公式来计算,这两种方法本质上是一样的,只是工程实现上不一样。下面我们分别讲解这两种实现方案。 (1)通过矩阵相乘为用户生成推荐
上面图2中的矩阵是用户行为矩阵,第i行第j列的元素代表了用户i对标的物j的偏好/评分,我们将该矩阵记为 ,其中n是用户数,m是标的物数。图7中的矩阵是标的物之间的相似度矩阵,我们将它记为
,这是一个方阵。
和
其实都是稀疏矩阵,我们通过计算这两个矩阵的乘积(Spark上是可以直接计算两个稀疏矩阵的乘积的),最终的结果矩阵就可以方便用来为用户推荐了:
。其中的第i行
代表的是用户i对每个标的物的偏好得分,我们从这个列表中过滤掉用户操作过的标的物,然后按照得分从高到低降序排列取topN就是最终给用户的推荐。
(2) 通计算公式为用户生成推荐
标的物相似度矩阵![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/57d8d5f50e1b1405b045ab39beb833cd.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/13b183421e45eeee98e0aea8cb11a09e.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/57d8d5f50e1b1405b045ab39beb833cd.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/57d8d5f50e1b1405b045ab39beb833cd.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d4667fcf6ac430b35bbf2cfb5d407b32.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3afa8305603e2761b48feb144105a6ed.jpeg)
讲到这里,基于Spark平台离线实现协同过滤算法的工程方案就讲完了。该实现方案强依赖于Spark的数据结构及分布式计算函数,可能在不同的计算平台上(比如Flink、Tensorflow等)具体的实现方式会不一样,但是基本思路和原理是一样的,有兴趣并且平时使用这些平台的读者可以在这些计算平台上独自实现一下,算是对自己的一个挑战。
四、近实时协同过滤算法的工程实现
上面第三节中的协同过滤工程实现方案适合做离线批量计算,比较适合标的物增长较缓慢的场景及产品(比如电商、视频、音乐等),对于新闻、短视频这类增量非常大并且时效性强的产品(如今日头条、快手等)是不太合适的。 那么我们是否可以设计出一套适合这类标的物快速增长的产品及场景下的协同过滤算法呢?实际上是可以的,下面我们来简单说一下怎么近实时实现简单的协同过滤算法。 我们的近实时协同过滤算法基于Kafka、HBase和Spark Streaming等分布式技术来实现,核心思想跟第三节中的类似,只不过我们这里是实时更新的,具体的算法流程及涉及到的数据结构见下面图10。下面我们对实现原理做简单介绍,整个推荐过程一共分为4步。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/783d9ca3e4da720d789253c38d013141.jpeg)
首先Spark Streaming程序从kafka读取一个时间窗口(Window)(一般一个时间窗口几秒钟,时间越短实时性越好,但是对计算能力要求也越高)内的用户行为数据,我们对同一个用户U的行为做聚合,得到上面图中间部分的用户行为列表(用户在该时间窗口中有k次行为记录)。 顺便说一下,因为是实时计算,所以用户行为数据会实时传输到Kafka中,供后续的Spark Streaming程序读取。
基于(1)中获取的用户行为记录,在这一步,我们需要更新标的物关联表CR,这里涉及到两类更新。
首先,用户U在时间窗口W内的所有k次行为
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/5ba3a258706965f9749be0b41d1a09b4.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ab6c5d6f69b827af4968137480f47699.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/b22c16304532cb14e0b84b76aa8543ce.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ad3831af9e04aed0ade8c61c33393a2b.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/4329c87e867e0cd0b46372a8c34961da.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/4329c87e867e0cd0b46372a8c34961da.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ad3831af9e04aed0ade8c61c33393a2b.png)
这里说一下,如果用户操作的某个标的物已经在行为表UAction中(这种情况一般是用户对同一个标的物做了多次操作,昨天看了这短视频,今天刷到了又看了一遍),我们需要将这两次相同的行为合并起来,具体上我们可以将这两次行为中得分高的赋值给行为表中该标的物的得分,同时将操作时间更新为最新操作该标的物的时间。同时将时间窗口W中该操作行为剔除掉,不参上面提到的时间窗口W中的操作行为跟UAction表中同样的操作行为的笛卡尔积计算。 4.3 更新用户的行为记录HBase表:UAction 基于(1)获取中的用户行为记录,当(2)处理完之后,将行为记录插入用户行为表UAction中。为了计算简单方便及保留用户最近的行为,用户行为表中我们可以只保留最近N条(可以选择的参数,比如20条)行为,同时只保留最近一段时间内(比如5天)的行为。 4.4 为用户生成个性化推荐
有了上面(1)、(2)、(3)步的基础,最后一步是为用户做推荐了,我们对计算过程简单说明如下: 用户U对标的物的评分
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/86f612bebbe0a5cda93af722a4c0685c.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/c598660c63ec2f83d7d32657416ed1af.png)
其中t是用户操作过的标的物,
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/66d76db8b6f81977bd10c7c8589a12de.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/46cfc244a0360c67b6893b39d5312091.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/79cdb3bfa74bcdbe6660befa208ed56c.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/1f478c3787d3e6e1ae4932eeb70a67a5.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9a10f94070a5733027939eba120d9213.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3527bda7ff22bc5824eccc7b9676571c.png)
当我们计算完了用户U跟所有标的物的得分之后,通过对得分降序排列取topN就可以作为U的推荐了。当标的物量很大(特别是新闻短视频类产品)时,实时计算还是压力非常大的,这时我们可以采用一个简单的技巧,我们事先从CR表中过滤出跟用户行为表中至少有一个标的物t有交集的标的物s(即标的物对
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/2b3bc36d51ab7edef43cbf1e37c6e0a5.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/5b8fb610fcacd2aba5a2e8c709da600d.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/86f612bebbe0a5cda93af722a4c0685c.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/46cfc244a0360c67b6893b39d5312091.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/86f612bebbe0a5cda93af722a4c0685c.png)
上面针对一个用户怎么实时计算协同过滤做了讲解,那么在一个时间窗口W中有若干个用户都有操作行为,这时可以将用户均匀分配到不同的Partition中,每个Partition为一批用户计推荐。具体流程可以参考下面图11。为每个用户计算好推荐后,可以插一份到HBase中作为一个副本,另外还可以通过Kafka将推荐结果同步一份到CouchBase集群中,供推荐Web服务为用户提供线上推荐服务。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/7efab82c5902bb434910fa54a2a0ec56.png)
五、协同过滤算法的应用场景
协同过滤是非常重要的一类推荐算法,我们在第三、第四节介绍了批处理(离线)协同过滤和近实时协同过滤的工程实现方案,相信大家对怎么基于Spark及HBase技术实现协同过滤有了比较清晰的认知。那么协同过滤算法可以用于哪些推荐业务场景呢?它主要的及延伸的应用场景有如下3类:
5.1 完全个性化推荐(范式)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/918e44d424a4bd31bd65e26aca13608a.jpeg)
虽然第二节没有直接讲标的物关联标的物的算法,但是讲到了怎么计算两个标的物之间的相似度(即图2中评分矩阵的列向量之间的相似度),我们利用该相似度可以计算某个标的物最相似的K个标的物(在第三节1中我们给出了实现标的物相似性的工程实现,在第四节4中我们也给出了近实时计算标的物相似度的实现方案)。那么这K个最相似的标的物就可以作为该标的物的关联推荐。 下图是电视猫相似影片推荐,是一类标的物关联标的物推荐范式,这类推荐可以基于协同过滤算法中间过程中的标的物topN相似度计算来实现。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/aad21df1ce5f957d4d002c84aa75508e.jpeg)
六、协同过滤算法的优缺点
前面对协同过滤算法做了比较完备的讲解,也提到了协同过滤算法的一些特点,这里我们简单罗列一些协同过滤算法的优缺点,方便大家更进一步深入了解协同过滤算法。 优点 协同过滤算有很多优点,总结下来最大的优点有如下几个: (1) 算法原理简单、思想朴素 从前面的几节讲解中不难看出,协同过滤算法的实现非常简单,只要懂简单的四则混合运算,了解向量和矩阵的基本概念就可以理解算法的原理。估计在整个机器学习领域,没有比这个算法更直观简单的算法了。 协同过滤的思想是简单的”物以类聚“、”人以群分“的思想,相信大家都可以理解,正因为思想朴素,所以算法原理简单。 (2) 算法易于分布式实现、可以处理海量数据集 我们在第三、第四节分别讲解了协同过滤算法的离线和实时工程实现,大家应该很容易看到,协同过滤算法可以非常容易利用Spark分布式平台来实现,因此可以通过增加计算节点很容易处理大规模数据集。 (3) 算法整体效果很不错 协同过滤算法是得到工业界验证过的一类重要算法,在Netflix、Google、Amazon及国内大型互联网公司都有很好的落地和应用。 (4) 能够为用户推荐出多样性、新颖性的标的物 前面讲到协同过滤算法是基于群体智慧的一类算法,它利用群体行为来做决策。在实践使用中已经被证明可以很好的为用户推荐多样性、新颖性的标的物。特别是当群体规模越大,用户行为越多,推荐的效果越好。 (5) 协同过滤算法只需要用户的行为信息,不依赖用户及标的物的其他信息 从前面的算法及工程实践中大家可以知道,协同过滤算法只依赖用户的操作行为,不依赖具体用户相关和标的物相关的信息就可以做推荐,往往用户信息和标的物信息都是比较复杂的半结构化或者非结构化的信息,处理起来很不方便。这是一个极大的优势,正因为这个优势让协同过滤算法在工业界大放异彩。
缺点 除了上面介绍的这些优点外,协同过滤算法也存在一些不足的方面,具体来说,在下面这些点,协同过滤算法存在软肋,有提升和优化的空间。 (1) 冷启动问题 协同过滤算法依赖用户的行为来为用户做推荐,如果用户行为少(比如新上线的产品或者用户规模不大的产品),这时就很难发挥协同过滤算法的优势和价值,甚至根本无法为用户做推荐。这时可以采用基于内容的推荐算法作为补充。 另外,对于新入库的标的物,由于只有很少的用户操作行为,这时相当于用户行为矩阵中该标的物对应的列基本都是零,这时无法计算出该标的物的相似标的物,同时,该标的物也不会出现在其他标的物的相似列表中,因此无法将该标的物推荐出去。这时,可以采用人工的策略将该标的物在一定的位置曝光,或者强行以一定的比例或者概率加入推荐列表中,通过收集该标的物的行为解决该标的物无法被推荐出去的问题。 在第七节我们会更加详细介绍协同过滤的冷启动解决方案。 (2) 稀疏性问题 对于现代的互联网产品,用户基数大,标的物数量多(特别是新闻、UGC短视频类产品),一般用户只对很少量的标的物产生操作行为,这是用户操作行为矩阵是非常稀疏的,太稀疏的行为矩阵计算出的标的物相似度往往不够精准,最终影响推荐结果的精准度。 协同过滤算法虽然简单,但是在实际业务中,为了让它有较好的效果,最终对业务产生较大的价值,我们在使用该算法时需要注意如下问题。 7.1 是采用基于用户的协同过滤还是采用基于标的物的协同过滤
在互联网产品中一般会采用基于标的物的协同过滤,因为对于互联网产品来说,用户相对于标的物变化更大,用户是增长较快的,标的物增长相对较慢(这也不是绝对的,像新闻、短视频类应用标的物也是增速巨大的),利用基于标的物的协同过滤算法效果更稳定。 7.2 对时间加权 一般来说,用户的兴趣是随着时间变化的,越是久远的行为对用户当前的兴趣贡献越小,基于该思考,我们可以对用户的行为矩阵做时间加权处理。将用户评分加上一个时间惩罚因子,对久远的行为进行一定的惩罚,可行的惩罚方案可以采用指数衰减的方式。例如,我们可以采用如下的公式来对时间做衰减,我们可以选择一个时间作为基准值,比如当前时间,下式中的n是标的物操作时间与基准时间相差的天数(n=0时,w(0)=1)。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/00966588f1eecb84769a4825756ad3b4.png)
7.3 关于用户对标的物的评分
在真实业务场景中,用户不一定对标的物评分,可能只有操作行为。这时可以采用隐式反馈的方式来做协同过滤,虽然隐式反馈的效果可能会差一些。 但同时,我们是可以通过一些方法和技巧来间接获得隐式反馈的评分的,主要有如下两类方法,通过这两类方法获得评分,是非常直观的,效果肯定比隐式反馈直接用0或者1好。 虽然很多时候用户的反馈是隐式的,但用户的操作行为是多样化的,有浏览、点击、点赞、购买、收藏、分享、评论等等,我们可以基于用户这些隐式行为的投入度(投入的时间成本、资金成本、社交压力等,投入成本越大给定越高的分数)对这些行为人为打分,比如浏览给1分,点赞给2分,转发给4分等等。这样我们就可以针对用户不同的行为生成差异化的评分。 对于像音乐、视频、文章等,我们可以记录用户在消费这些标的物上所花的时间来计算评分。拿视频来说,如果一个电影总时长是100分钟,如果用户看了60分钟就退出了,那么我们就可以给用户打6分(10分制,因为用户看了60%,所以打6分)。 7.4 相似度计算 我们在前面讲解协同过滤算法时需要计算两个向量的相似度,本文前面采用的是cosine余弦相似度。其实,计算两个向量相似度的方式非常多,cosine余弦是被证明在很多场景效果都不错的一个算法,但并不是所有场景cosine余弦都是最好的,需要针对不同场景做尝试和对比。在这里,我们简单罗列一些常用的相似度计算的方法,供大家参考。
(1) cosine余弦相似度 前面已经花了很大篇幅讲解了cosine的计算公式,这里不赘述。需要提一点的是,针对隐式反馈(用户只有点击等行为,没有评分),向量的元素要么为1要么为0,直接用cosine余弦公式效果不是很好,参考文献5针对隐式反馈给出了一个更好的计算公式(见下面图14),其中
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/6fa85565df90973e3b0d3e7ef702c07d.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/6fa85565df90973e3b0d3e7ef702c07d.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/0d39de904a3066d5242ef59dafc7f836.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/31aa4239ec21fb5a8eb698475285f6c3.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3703796b9347cc653f401cd321f681cc.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/1a62bd51e28d8531be796a71d080e9e0.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/44eb60b7439007881e98203eecdd7c1b.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/0cb7c8b1a747d1fd632667f782a36326.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/fca36c79f3d75e321836cc740b65e3bc.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d1eebd667f771c9abb0c67b1ca59ad42.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/a33ef74a974f290da22e57167c6557a4.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/1e0faf864a870c61b2c1a32de9b1f120.png)
前面在讲协同过滤算法的缺点时讲到协同过滤算法会存在严重的冷启动问题,主要表现在如下3个方面: (1) 用户冷启动
所谓用户冷启动就是新用户没有太多的行为,我们无法为他计算个性化推荐。这时可行的推荐策略是为这类用户推荐热门标的物、通过人工编排筛选出的标的物。或者用户只有很少的行为,协同过滤效果也不好,这时可以采用基于内容的推荐算法补充。
(2)标的物冷启动
所谓标的物冷启动就是新的标的物加入系统,没有用户操作行为,这时协同过滤算法也无法将该标的物推荐给用户。可行的解决方案有三个:
首先,这类标的物可以通过人工曝光到比较好的推荐位(如首页)上,在尽短的时间内获得足够多的用户行为,这样就可以“启动”协同过滤算法了。这里有个比较大的问题是,如果该标的物不是主流的标的物、不够热门的话,放在好的位子不光占用资源同时对用户体验还不好。 其次,在推荐算法上做一些策略,可以将这类新的标的物以一定的概率混杂在用户的推荐列表中,让这些标的物有足够多的曝光,在曝光过程中收集用户行为,同时该方法也可以提升用户推荐的多样性。 最后,这类标的物也可以通过基于内容的推荐算法来分发出去,作者在《基于内容的推荐算法》中已经讲过内容推荐,这里不再赘述。 (3)系统冷启动所谓系统冷启动,就是该产品是一个新开发不久的产品,还在发展用户初期阶段,这时协同过滤算法基本无法起作用,最好采用基于内容的推荐算法或者直接利用编辑编排一些多样性的优质内容作为推荐备选推荐。 至此,协同过滤推荐算法基本讲完了,在最后我们做一个简单总结。本文对协同过滤算法原理、工程实践进行了介绍,在工程实践上既讲解了批处理实现方案,同时也讲解了一种近实时实现方案。并且对协同过滤的产品形态及应用场景、优缺点、在落地协同过滤算法中需要注意的问题进行了介绍。希望本文可以帮助读者更深入地了解协同过滤推荐算法。参考文献中的材料从学术上、工业界都对协同过滤算法原理、实践从不同视角及场景进行了论述,具有非常大的参考价值,值得大家阅读学习。
参考文献
1. Item-based collaborative filtering recommendation algorithms
2. item-based top-n recommendation algorithms 3. Collaborative filtering for implicit feedback datasets 4. Amazon.com reecommendations: Item-to-item collaborative filtering 5. TencentRec- Real-time Stream Recommendation in Practice 6. Google news personalization:Scalable online collaborative flitering 7. Forgetting mechanisms for incremental collaborative filtering 8. Scalable collaborative filtering using incremental update and local link prediction 9. GroupLens:An Open Architecture for Collaborative Filtering of Netnews (*本文为 AI科技大本营转载文章,转载请微信原作者)
社群福利
扫码添加小助手,回复:大会,加入2019 AI开发者大会福利群,每周一、三、五更新技术福利,还有不定期的抽奖活动~
◆
精彩推荐
◆
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/02e2671771512c88682057e0f3f25d27.jpeg)
60+技术大咖与你相约 2019 AI ProCon!大会早鸟票已售罄,优惠票3.5折限时速抢进行中......2019 AI开发者大会将于9月6日-7日在北京举行,这一届AI开发者大会有哪些亮点?一线公司的大牛们都在关注什么?AI行业的风向是什么?2019 AI开发者大会,倾听大牛分享,聚焦技术实践,和万千开发者共成长。
推荐阅读
连续亏损6年,负债超10亿美元,DeepMind靠烧钱模式能走多远?
七夕大礼包:26个AI学习资源送给你
玩王者荣耀用不好英雄?两阶段算法帮你精准推荐精彩视频
突发!Python再次第一,Java和C下降,凭什么?
白话中台战略:中台是个什么鬼?
伟创力回应扣押华为物资;谷歌更新图片界面;Python 3.8.0b3 发布 | 极客头条
沃尔玛也要发币了,Libra忙活半天为他人做了嫁衣?
知名饮料制造商股价暴涨500%惊动FBI,只因在名字中加入了"区块链" ?
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/2cba20d74577dec51dc9daf89a6a59e5.png)