协同过滤使用的主要数据都是用户对物品的评价。协同过滤可以分为以下3类:
基于领域的方法:基于用户的推荐(User-based Recommendation)、基于物品的推荐(Item-based Recommendation);
基于模型的方法:SVD、LFM等;
基于图的方法;
本节主要介绍基于邻域的方法。
见《推荐系统:技术、评估及高效算法》P30
基于物品的推荐系统更具可解释性。
Item CF 和 User CF 是基于协同过滤推荐的两个最基本的算法,User CF 是很早以前就提出来了,Item CF 是从 Amazon 的论文和专利发表之后(2001 年左右)开始流行,大家都觉得 Item CF 从性能和复杂度上比 User CF 更优,其中的一个主要原因就是对于一个在线网站,用户的数量往往大大超过物品的数量,同时物品的数据相对稳定,因此计算物品的相似度不但计算量较小,同时也不必频繁更新。但我们往往忽略了这种情况只适应于提供商品的电子商务网站,对于新闻,博客或者微内容的推荐系统,情况往往是相反的,物品的数量是海量的,同时也是更新频繁的,所以单从复杂度的角度,这两个算法在不同的系统中各有优势,推荐引擎的设计者需要根据自己应用的特点选择更加合适的算法。
在非社交网络的网站中,内容内在的联系是很重要的推荐原则,它比基于相似用户的推荐原则更加有效。比如在购书网站上,当你看一本书的时候,推荐引擎会给你推荐相关的书籍,这个推荐的重要性远远超过了网站首页对该用户的综合推荐。可以看到,在这种情况下,Item CF 的推荐成为了引导用户浏览的重要手段。同时 Item CF 便于为推荐做出解释,在一个非社交网络的网站中,给某个用户推荐一本书,同时给出的解释是某某和你有相似兴趣的人也看了这本书,这很难让用户信服,因为用户可能根本不认识那个人;但如果解释说是因为这本书和你以前看的某本书相似,用户可能就觉得合理而采纳了此推荐。
相反的,在现今很流行的社交网络站点中,User CF 是一个更不错的选择,User CF 加上社会网络信息,可以增加用户对推荐解释的信服程度。
关于推荐的多样性,有两种度量方法:
第一种度量方法是从单个用户的角度度量,就是说给定一个用户,查看系统给出的推荐列表是否多样,也就是要比较推荐列表中的物品之间两两的相似度,不难想到,对这种度量方法,Item CF 的多样性显然不如 User CF 的好,因为 Item CF 的推荐就是和以前看的东西最相似的。
第二种度量方法是考虑系统的多样性,也被称为覆盖率 (Coverage),它是指一个推荐系统是否能够提供给所有用户丰富的选择。在这种指标下,Item CF 的多样性要远远好于 User CF, 因为 User CF 总是倾向于推荐热门的,从另一个侧面看,也就是说,Item CF 的推荐有很好的新颖性,很擅长推荐长尾里的物品。所以,尽管大多数情况,Item CF 的精度略小于 User CF, 但如果考虑多样性,Item CF 却比 User CF 好很多。
如果你对推荐的多样性还心存疑惑,那么下面我们再举个实例看看 User CF 和 Item CF 的多样性到底有什么差别。首先,假设每个用户兴趣爱好都是广泛的,喜欢好几个领域的东西,不过每个用户肯定也有一个主要的领域,对这个领域会比其他领域更加关心。给定一个用户,假设他喜欢 3 个领域 A,B,C,A 是他喜欢的主要领域,这个时候我们来看 User CF 和 Item CF 倾向于做出什么推荐:如果用 User CF, 它会将 A,B,C 三个领域中比较热门的东西推荐给用户;而如果用 ItemCF,它会基本上只推荐 A 领域的东西给用户。所以我们看到因为 User CF 只推荐热门的,所以它在推荐长尾里项目方面的能力不足;而 Item CF 只推荐 A 领域给用户,这样他有限的推荐列表中就可能包含了一定数量的不热门的长尾物品,同时 Item CF 的推荐对这个用户而言,显然多样性不足。但是对整个系统而言,因为不同的用户的主要兴趣点不同,所以系统的覆盖率会比较好。
从上面的分析,可以很清晰的看到,这两种推荐都有其合理性,但都不是最好的选择,因此他们的精度也会有损失。其实对这类系统的最好选择是,如果系统给这个用户推荐 30 个物品,既不是每个领域挑选 10 个最热门的给他,也不是推荐 30 个 A 领域的给他,而是比如推荐 15 个 A 领域的给他,剩下的 15 个从 B,C 中选择。所以结合 User CF 和 Item CF 是最优的选择,结合的基本原则就是当采用 Item CF 导致系统对个人推荐的多样性不足时,我们通过加入 User CF 增加个人推荐的多样性,从而提高精度,而当因为采用 User CF 而使系统的整体多样性不足时,我们可以通过加入 Item CF 增加整体的多样性,同样同样可以提高推荐的精度。
前面我们大部分都是从推荐引擎的角度考虑哪个算法更优,但其实我们更多的应该考虑作为推荐引擎的最终使用者 – 应用用户对推荐算法的适应度。
对于 User CF,推荐的原则是假设用户会喜欢那些和他有相同喜好的用户喜欢的东西,但如果一个用户没有相同喜好的朋友,那 User CF 的算法的效果就会很差,所以一个用户对的 CF 算法的适应度是和他有多少共同喜好用户成正比的。
Item CF 算法也有一个基本假设,就是用户会喜欢和他以前喜欢的东西相似的东西,那么我们可以计算一个用户喜欢的物品的自相似度。一个用户喜欢物品的自相似度大,就说明他喜欢的东西都是比较相似的,也就是说他比较符合 Item CF 方法的基本假设,那么他对 Item CF 的适应度自然比较好;反之,如果自相似度小,就说明这个用户的喜好习惯并不满足 Item CF 方法的基本假设,那么对于这种用户,用 Item CF 方法做出好的推荐的可能性非常低。
《推荐系统实践》
用户行为在个性化推荐系统中一般分两种——显性反馈行为(explicit feedback)和隐性反馈行为(implicit feedback)。在很多网站中,很多用户甚至只有隐性反馈数据,而没有显性反馈数据。
很多关于互联网数据的研究发现,互联网上的很多数据分布都满足一种称为Power Law①的分布,这个分布在互联网领域也称长尾分布。 ① 参见“浅谈网络世界的Power Law现象”,地址为http://mmdays.com/2008/11/22/power_law_1/。 长尾分布其实很早就被统计学家注意到了。1932年,哈佛大学的语言学家Zipf在研究英文单词的词频时发现,如果将单词出现的频率按照由高到低排列,则每个单词出现的频率和它在热门排行榜中排名的常数次幂成反比。
一般认为,新用户倾向于浏览热门的物品,因为他们对网站还不熟悉,只能点击首页的热门物品,而老用户会逐渐开始浏览冷门的物品。
我们参考《推荐系统:技术、评估及高效算法》的数学符号:
我们定义用户集合为 U U U,物品集合为 T T T,系统评分集合为 R R R,评分的可选集合为 S S S,如 S = { 1 , 2 , 3 , 4 , 5 } S = \{1,2,3,4,5\} S={1,2,3,4,5}。
r u i r_{ui} rui表示用户 u ∈ U u \in U u∈U对于特定物品 i ∈ T i \in T i∈T的评分。
U i U_i Ui表示集合中已经对物品 i i i进行了评分的用户集合。
T u T_u Tu表示被用户 U U U所评分的集合。
T u v T_{uv} Tuv表示被用户 u u u和 v v v同时评论的物品集合。
U i j U_{ij} Uij表示同时对物品 i i i和物品 j j j做出评论的物品集合。
基于用户的协同过滤推荐的基本原理是,根据所有用户对物品或者信息的偏好,发现与当前用户口味和偏好相似的“邻居”用户群,在一般的应用中是采用计算“K-邻居”的算法;然后,基于这 K 个邻居的历史偏好信息,为当前用户进行推荐。
上图示意出基于用户的协同过滤推荐机制的基本原理,假设用户 A 喜欢物品 A,物品 C,用户 B 喜欢物品 B,用户 C 喜欢物品 A ,物品 C 和物品 D;从这些用户的历史喜好信息中,我们可以发现用户 A 和用户 C 的口味和偏好是比较类似的,同时用户 C 还喜欢物品 D,那么我们可以推断用户 A 可能也喜欢物品 D,因此可以将物品 D 推荐给用户 A。
基于用户的协同过滤推荐机制和基于人口统计学的推荐机制都是计算用户的相似度,并基于“邻居”用户群计算推荐,但它们所不同的是如何计算用户的相似度,基于人口统计学的机制只考虑用户本身的特征,而基于用户的协同过滤机制可是在用户的历史偏好的数据上计算用户的相似度,它的基本假设是,喜欢类似物品的用户可能有相同或者相似的口味和偏好。
见《推荐系统:技术、评估及高效算法》P28
基于用户的协同过滤计算用户 u u u对 i i i的评分 r u i r_{ui} rui的方法是:利用和用户 u u u兴趣相同的用户对物品 i i i的评分预估用户 u u u对 i i i的评分。
因此,2个核心的问题是:
我们用 ω u v \omega_{uv} ωuv表示用户 u u u和 v v v的相似程度;与用户最相似的 k k k个用户表示为 N ( u ) N(u) N(u),这些用户中对物品 i i i做了评分的用户表示为 N i ( U ) N_i(U) Ni(U)。
我们预测 r u i r_{ui} rui为这些用户对物品 i i i的评分的平均值:
r u i ^ = 1 ∣ N i ( u ) ∣ ∑ v ∈ N i ( u ) r v i \hat{r_{ui}} = \frac{1}{|N_i(u)|}\sum_{v \in N_i(u)}{r_{vi}} rui^=∣Ni(u)∣1v∈Ni(u)∑rvi
上述是最简单的计算 r u i r_{ui} rui的方式,但我们还应该考虑到用户 u u u与各个近邻间的相似程度其实是有差异的,他们对 r u i r_{ui} rui的影响也应该不同,我们对各个近邻的评分进行加权平均得出 r u i r_{ui} rui:
r u i ^ = ∑ v ∈ N i ( u ) ω u v r v i ∑ v ∈ N i ( u ) ∣ ω u v ∣ \hat{r_{ui}} = \frac{\sum_{v \in N_i(u)}\omega_{uv}{r_{vi}}}{\sum_{v \in N_i(u)}|\omega_{uv}|} rui^=∑v∈Ni(u)∣ωuv∣∑v∈Ni(u)ωuvrvi
注意权重应该做标准化,以保证 r u i r_{ui} rui不超出评分标准范围。
还有一个问题,上面的方法没有考虑用户会使用不同的评分尺度,比如一个用户对所有物品都评分较高,而另一个用户对所有物品都评分较低,这种情况下,他们为同一个物品评3分是完全不同含义的。解决这个问题的办法是将近邻的评分 r v i r_{vi} rvi进行标准化转移 h ( r v i ) h(r_{vi}) h(rvi),因此最终的 r u i r_{ui} rui调整为:
r u i ^ = h − 1 ( ∑ v ∈ N i ( u ) ω u v h ( r v i ) ∑ v ∈ N i ( u ) ∣ ω u v ∣ ) \hat{r_{ui}} = h^{-1}(\frac{\sum_{v \in N_i(u)}\omega_{uv}{h(r_{vi}})}{\sum_{v \in N_i(u)}|\omega_{uv}|}) rui^=h−1(∑v∈Ni(u)∣ωuv∣∑v∈Ni(u)ωuvh(rvi))
常用的 h ( ) h() h()函数在下面的评分标准化介绍。
上述计算都是基于用户的评分预测的,也就是说计算用户的商品的具体评分。另一种情形是分类,找出用户对物品最有可能的评分。
选择回归还是分类很大程度取决于系统的评分刻度类型。如果一个评分刻度是连续的,那么回归更合适。如果评分是一些离散的值,比如喜欢、不喜欢,则分类更合适。
事实上,分类的方式都可以通过将类型转换成分数来变成回归问题,前提是这几个分类是可比较的,比如理解为喜欢是高分,不喜欢是低分。
比较2种方法:当近邻数量增加时,在回归方法中,用户 u u u对 i i i的评分趋向于平均分;在分类方法中,用户 u u u对 i i i的评分等于物品 i i i出现最频繁的评分。
对于分类的应用可参考《推荐系统:技术、评估及高效算法》。
基于项目的协同过滤推荐的基本原理也是类似的,只是说它使用所有用户对物品或者信息的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户:
假设用户 A 喜欢物品 A 和物品 C,用户 B 喜欢物品 A,物品 B 和物品 C,用户 C 喜欢物品 A,从这些用户的历史喜好可以分析出物品 A 和物品 C 时比较类似的,喜欢物品 A 的人都喜欢物品 C,基于这个数据可以推断用户 C 很有可能也喜欢物品 C,所以系统会将物品 C 推荐给用户 C。
与上面讲的类似,基于项目的协同过滤推荐和基于内容的推荐其实都是基于物品相似度预测推荐,只是相似度计算的方法不一样,前者是从用户历史的偏好推断,而后者是基于物品本身的属性特征信息。
见《推荐系统:技术、评估及高效算法》P29
基于物品的协同过滤计算用户 u u u对 i i i的评分 r u i r_{ui} rui的方法是:将与用户购买喜欢的物品相似的物品推荐给用户。
因此,2个核心的问题是:
我们用 ω i j \omega_{ij} ωij表示物品 i i i和 j j j的相似程度;与物 i i i品最相似的 k k k个物品表示为 N ( i ) N(i) N(i),用户 u u u做了评分的近邻物品表示为 N u ( i ) N_u(i) Nu(i)。
同时我们考虑近邻的权重:
r u i ^ = ∑ j ∈ N u ( i ) ω i j r u j ∑ j ∈ N u ( i ) ∣ ω i j ∣ \hat{r_{ui}} = \frac{\sum_{j \in N_u(i)}\omega_{ij}{r_{uj}}}{\sum_{j \in N_u(i)}|\omega_{ij}|} rui^=∑j∈Nu(i)∣ωij∣∑j∈Nu(i)ωijruj
注意权重应该做标准化,以保证 r u i r_{ui} rui不超出评分标准范围。
同样,考虑到不同商品的评分分布不同,最终的 r u i r_{ui} rui调整为:
r u i ^ = h − 1 ( ∑ j ∈ N u ( i ) ω i j h ( r u j ) ∑ j ∈ N u ( i ) ∣ ω i j ∣ ) \hat{r_{ui}} = h^{-1}(\frac{\sum_{j \in N_u(i)}\omega_{ij}h(r_{uj})}{\sum_{j \in N_u(i)}|\omega_{ij}|}) rui^=h−1(∑j∈Nu(i)∣ωij∣∑j∈Nu(i)ωijh(ruj))
常用的 h ( ) h() h()函数在下面的评分标准化介绍。
《推荐系统实践》
亚马逊网的研究人员在设计ItemCF算法之初发现ItemCF算法计算出的图书相关表存在一个问题,就是很多书都和《哈利波特》相关。③也就是说,购买任何一本书的人似乎都会购买《哈利波特》。后来他们研究发现,主要是因为《哈利波特》太热门了,确实是购买任何一本书的人几乎都会购买它。
要实现协同过滤,需要一下几个步骤
•收集用户偏好
•找到相似的用户或物品
•计算推荐
在这个过程中,以下3个要素对推荐
当一个用户为某个物品评分时,每个人都有自己的评分准则,这会对推荐系统的准确性、效率等产生很大的影响,所以我们一般需要将用户的评分标准到更一般的整体评分标准。最常用的标准化方式有:
将用户评分标准化的一个最直观的方式就是将用户的评分减去他所有评分的平均值 r ‾ u \overline{r}_u ru。同时,预测用户对某个物品的评分时,就是将预测分加上他自身评分的平均分,亦即对于基于用户的推荐方法来说:
h ( r u i ) = r u i − r ‾ u r ^ u i = r ‾ u + ∑ v ∈ N i ( u ) ω u v ( r v i − r ‾ v ) ∑ v ∈ N i ( u ) ∣ ω u v ∣ h(r_{ui}) = r_{ui} - \overline{r}_u \\ \hat{r}_{ui} = \overline{r}_u + \frac{\sum_{v \in N_i(u)}\omega_{uv}(r_{vi} - \overline{r}_v)}{\sum_{v \in N_i(u)}|\omega_{uv}|} h(rui)=rui−rur^ui=ru+∑v∈Ni(u)∣ωuv∣∑v∈Ni(u)ωuv(rvi−rv)
对于基于物品的推荐方法来说:
h ( r u i ) = r u i − r ‾ i r ^ u i = r ‾ i + ∑ j ∈ N u ( i ) ω i j ( r u j − r ‾ j ) ∑ j ∈ N u ( i ) ∣ ω i j ∣ h(r_{ui}) = r_{ui} - \overline{r}_i \\ \hat{r}_{ui} = \overline{r}_i + \frac{\sum_{j \in N_u(i)}\omega_{ij}(r_{uj} - \overline{r}_j)}{\sum_{j \in N_u(i)}|\omega_{ij}|} h(rui)=rui−rir^ui=ri+∑j∈Nu(i)∣ωij∣∑j∈Nu(i)ωij(ruj−rj)
均值中心化方法移除了针对平均评分的不同感受而导致的偏差,而Z-score标准化还考虑到了个人评分范围不同带来的差异性。
考虑这种情况,A用户为5个商品的评分是{1,2,3,4,5},而B用户为这5个用户的评分是{3,3,3,3,3}。他们的 r ‾ u = 3 \overline{r}_u = 3 ru=3,假如现在他们为同一个商品T评分4分,他们的含义是不同的。
因此,在基于用户的推荐方法中,标准化评分 r u i r_{ui} rui等于用户均值中心化评分除以用户评分标准差:
h ( r u i ) = r u i − r ‾ u σ u h(r_{ui}) = \frac{r_{ui} -\overline{r}_u} {\sigma_u} h(rui)=σurui−ru
对于上面的例子而言,由于B用户的方差小于A,所以对于商品T,B用户的评分大于A。
于是,基于用户的推荐方法预测评分 r u i r_{ui} rui可以表达为:
r ^ u i = r ‾ u + ∑ v ∈ N i ( u ) ω u v ( r v i − r ‾ v ) / σ v ∑ v ∈ N i ( u ) ∣ ω u v ∣ \hat{r}_{ui} = \overline{r}_u + \frac{\sum_{v \in N_i(u)}\omega_{uv}(r_{vi} - \overline{r}_v)/\sigma_v}{\sum_{v \in N_i(u)}|\omega_{uv}|} r^ui=ru+∑v∈Ni(u)∣ωuv∣∑v∈Ni(u)ωuv(rvi−rv)/σv
同理,基于物品的推荐方法为:
$$
h(r_{ui}) = \frac{r_{ui} - \overline{r}_i}{\sigma_j}
\hat{r}{ui} = \overline{r}i + \frac{\sum{j \in N_u(i)}\omega{ij}(r_{uj} - \overline{r}j)/\sigma_j}{\sum{j \in N_u(i)}|\omega_{ij}|}
$$
推荐系统中的一个重要问题是:如何计算2个商品或者物品的相似度?
目前,常用的计算方式有:
(1)欧几里得相似度:均方差相似度(MSD)
最初用于计算欧几里德空间中两个点的距离,用于计算相似度时:
1 1 + ∑ i ∈ T u v r u i 2 − r v i 2 \frac{1}{1+\sum_{i \in T_{uv}}\sqrt{r_{ui}^2-r_{vi}^2}} 1+∑i∈Tuvrui2−rvi21
其中$ T_{uv} 表 示 用 户 表示用户 表示用户u 和 用 户 和用户 和用户v$都有评分的物品。基于物品的推荐与此类似。
而均方差相似度使用2个用户对相同物品评分差的平方总和和均值的倒数表示2个用户的相似度:
M S D ( u , v ) = ∣ T u v ∣ ∑ i ∈ T u v r u i 2 − r v i 2 MSD(u,v) = \frac{|T_{uv}|}{\sum_{i \in T_{uv}}\sqrt{r_{ui}^2-r_{vi}^2}} MSD(u,v)=∑i∈Tuvrui2−rvi2∣Tuv∣
这种方法无法表示负关联。
(2)余弦相似度
C V ( u , v ) = ∑ i ∈ T u v r u i r v i ∑ i ∈ T u r u i 2 ∑ i ∈ T v r v i 2 CV(u,v) = \frac{\sum_{i \in T_{uv}}r_{ui}r_{vi}}{\sqrt {\sum_{i \in T_u}r_{ui}^2 \sum_{i \in T_v}r_{vi}^2 } } CV(u,v)=∑i∈Turui2∑i∈Tvrvi2∑i∈Tuvruirvi
关于余弦相似度的解释请参考:??
(3)皮尔逊相关度(Pearson Correlation)
余弦相似度并没有考虑评分均值及方差的影响,皮尔逊相关度做了调整:
P V ( u , v ) = ∑ i ∈ T u v ( r u i − r u ‾ ) ( r v i − r v ‾ ) ∑ i ∈ T u v ( r u i − r u ‾ ) 2 ∑ i ∈ T u v ( r v i − r v ‾ ) 2 PV(u,v) = \frac{\sum_{i \in T_{uv}}(r_{ui} - \overline{r_u})(r_{vi}- \overline{r_v})}{\sqrt {\sum_{i \in T_{uv}}(r_{ui}- \overline{r_u})^2 \sum_{i \in T_{uv}}(r_{vi}-\overline{r_v})^2 } } PV(u,v)=∑i∈Tuv(rui−ru)2∑i∈Tuv(rvi−rv)2∑i∈Tuv(rui−ru)(rvi−rv)
注意,这和先进行Z-score标准化评分,然后计算余弦相似度是不同的,皮尔逊相关度仅考虑了用户评分交集的标准差,而不是全部。
不是指考虑了均值吗?有标准差?
基于物品的推荐为:
P V ( i , j ) = ∑ u ∈ U i j ( r u i − r i ‾ ) ( r v i − r j ‾ ) ∑ u ∈ U i j ( r u i − r u ‾ ) 2 ∑ u ∈ U i j ( r v i − r j ‾ ) 2 PV(i,j) = \frac{\sum_{u \in U_{ij}}(r_{ui} - \overline{r_i})(r_{vi}- \overline{r_j})}{\sqrt {\sum_{u \in U_{ij}}(r_{ui}- \overline{r_u})^2 \sum_{u \in U_{ij}}(r_{vi}-\overline{r_j})^2 } } PV(i,j)=∑u∈Uij(rui−ru)2∑u∈Uij(rvi−rj)2∑u∈Uij(rui−ri)(rvi−rj)
(4)调整的余弦相似度(Adjusted Cosine)
一般而言,用户间的方差要明显大于物品间的评分,因此计算物品间相似度时,相比于用物品均值中心化,用户均值话更加合适:
A V ( i , j ) = ∑ u ∈ U i j ( r u i − r u ‾ ) ( r v i − r u ‾ ) ∑ u ∈ U i j ( r u i − r u ‾ ) 2 ∑ u ∈ U i j ( r v i − r u ‾ ) 2 AV(i,j) = \frac{\sum_{u \in U_{ij}}(r_{ui} - \overline{r_u})(r_{vi}- \overline{r_u})}{\sqrt {\sum_{u \in U_{ij}}(r_{ui}- \overline{r_u})^2 \sum_{u \in U_{ij}}(r_{vi}-\overline{r_u})^2 } } AV(i,j)=∑u∈Uij(rui−ru)2∑u∈Uij(rvi−ru)2∑u∈Uij(rui−ru)(rvi−ru)
在一些基于物品的推荐例子中,用调整的余弦相似度要好于皮尔逊相似度。
(5)斯皮尔曼等级关联(Spearman Rank Correlation, SRC)
和皮尔逊相关度直接使用评分不同,斯皮尔曼等级关联运用这些评分的排名。
S R C ( u , v ) = ∑ i ∈ T u v ( k u i − k u ‾ ) ( k v i − k v ‾ ) ∑ i ∈ T u v ( k u i − k u ‾ ) 2 ∑ i ∈ T u v ( k v i − k v ‾ ) 2 SRC(u,v) = \frac{\sum_{i \in T_{uv}}(k_{ui} - \overline{k_u})(k_{vi}- \overline{k_v})}{\sqrt {\sum_{i \in T_{uv}}(k_{ui}- \overline{k_u})^2 \sum_{i \in T_{uv}}(k_{vi}-\overline{k_v})^2 } } SRC(u,v)=∑i∈Tuv(kui−ku)2∑i∈Tuv(kvi−kv)2∑i∈Tuv(kui−ku)(kvi−kv)
其中 k u i k_{ui} kui为物品 i i i在用户 u u u所评分物品中的排位, k ‾ u \overline k_u ku是用户所评价物品的平均排名。
SRC的主要优势在于排名可以绕开标准化评分的问题,但当用户评分只有少量可选项时,这种方法不是最好的,因为会产生大量的并列排序。而且由于要计算排序,消耗较大。
参考《推荐系统:技术、评估及高效算法》P35。
推荐精度方面:PC > SRC > MSD
可能由于MSD没有考虑负关联,它的准确度最低;而PC比SRC略高。
尽管一般认为PC是最优的相似度计算方法,但最近的一些研究表明,这些算法效果很大程度依赖于数据。因此最好的方式是对各种方法都做一个验证。
假如2个用户只有少量几件共同评价的商品,需要降低相似度重要性的权重,例如当2人共同评分的的物品数量小于给定的参数 γ \gamma γ时,它们的相似度会受到惩罚:
ω u v ′ = m i n { ∣ T u v ∣ , γ } γ ∗ ω u v \omega'_{uv} = \frac{min\{|T_{uv}|,\gamma\}}{\gamma} * \omega_{uv} ωuv′=γmin{∣Tuv∣,γ}∗ωuv
基于物品的推荐也类似:
ω i j ′ = m i n { ∣ U = i j ∣ , γ } γ ∗ ω i j \omega'_{ij} = \frac{min\{|U_{=ij}|,\gamma\}}{\gamma} * \omega_{ij} ωij′=γmin{∣U=ij∣,γ}∗ωij
研究发现 γ > = 25 \gamma>=25 γ>=25时,可以显著提高评分预测的准确性,其中 γ = 50 \gamma=50 γ=50时取的最好效果。不过同样,对于不同的数据,交叉验证时最好的调参方法。
有一种修正的方法见:参考《推荐系统:技术、评估及高效算法》P36。
2个用户对物品给出一致的喜欢或者不喜欢的评分,可能会不如他们给出差异较大的评分时提供更多的信息。
比如一个物品是大部分人都喜欢或者不喜欢,那2个用户有相同的评分是很正常的。推荐系统解决这类的办法是反用户频率IUF,类似于信息检索的IDF:每个物品都会有一个全中,对应评论了物品的用户比例的 l o g log log值:
λ i = log ∣ U ∣ ∣ U i ∣ \lambda_i = \log \frac{|U|}{|U_i|} λi=log∣Ui∣∣U∣
因此,评分修正为:
P V ( u , v ) = ∑ i ∈ T u v λ i ( r u i − r u ‾ ) ( r v i − r v ‾ ) ∑ i ∈ T u v λ i ( r u i − r u ‾ ) 2 ∑ i ∈ T u v λ i ( r v i − r v ‾ ) 2 PV(u,v) = \frac{\sum_{i \in T_{uv}} \lambda_i(r_{ui} - \overline{r_u})(r_{vi}- \overline{r_v})}{\sqrt {\sum_{i \in T_{uv}}\lambda_i(r_{ui}- \overline{r_u})^2 \sum_{i \in T_{uv}}\lambda_i(r_{vi}-\overline{r_v})^2 } } PV(u,v)=∑i∈Tuvλi(rui−ru)2∑i∈Tuvλi(rvi−rv)2∑i∈Tuvλi(rui−ru)(rvi−rv)
基于物品的推荐类似。
计算了用户或者物品的相似度后,如何去合适的近邻用于推荐呢?一般而言通常分为2个步骤:
在大型系统中,用户、商品的数量数以亿计,我们无法将他们的相似度矩阵全部保存在内存中,我们希望筛选出合适的数量保存在内存中,以下是常见的方法:
(1)top-N过滤:对一个用户或者一个商品,我们只保存最相似的N个近邻的相似度。但N的选择要兼顾效率和准确度。N过大则浪费内存,过小则会牺牲推荐的准确性。
(2)阈值过滤:保留相似度大于某个阈值的近邻,这种方法更灵活,但合理的阈值选择很困难。
(3)负值过滤:根据具体推荐需要,确定是否保留负相关度的近邻。
对于一个新的评分预测可以通过 k k k个近邻方法得到,如何选择 k k k的数值呢?经验证,预测的偏差随着 k k k的增加通常呈现一个凹的函数。
当近邻数目限制在一个很小的数量的时候(如着 k < 20 k<20 k<20),预测精度通常会很低;当着 k k k增加时,越来越多的近邻参与到预测中,那些用单独近邻所造成的偏差就会被平均掉,精度得到提升;随着着 k k k的继续增大着(如 k > 50 k>50 k>50),由于一些重要的关联被不重要的关联所削弱,精度会逐步下降。
一般而言,近邻数目在20~50间比较合适,但最有的着 k k k值依然建议通过交叉验证来选择。
最后还需注意,基于少量非常相似的用户可能得到更加新颖的推荐结果,但代价时降低准确度。