协同过滤推荐算法的理解

背景

本文介绍协同过滤推荐算法在我们项目组的使用方案,作为笔记或者供大家参考的小结。协同过滤推荐算法理解为一个推荐算法,推荐算法一个是基于用户的喜好程度的推荐算法可以简写为UserCF,另一个就是根据商品被喜好程度的推荐算法简称为ItemCF

UserCF介绍

UserCF推荐算法其实就是考察某个用户喜好与另一个用户的喜好是否相近,通过跟他臭味相投的人,他臭味相投的人喜欢啥的就推荐给他。
A用户喜欢: a, b, c, d, e
B用户喜欢:a, b, c, x, f
A用户与B用户是一对臭味相投的人,A用户登录系统,那么需要将B用户的商品推荐给A用户即可。推荐商品为 x, f,为什么不推荐a, b, c呢,因为A已经喜欢过a, b, c了;推荐就是要推荐你没有的东西,但是你又可能喜欢的

通过上面的例子,我们需要客观计算判断两个人臭味相投的程度,也就是提出一个数学公式来表示他们的兴趣相似度。比如我的爱好能跟范冰冰的爱好相同的吗,肯定不会相同,但是差别有多大那是要计算出来。

N ( A ) ∩ N ( B ) ∣ N ( A ) ∣ ∣ N ( B ) ∣ \frac{N(A) \cap N(B) }{\sqrt{|N(A)| |N(B)|}} N(A)N(B) N(A)N(B) = W A B W_{AB} WAB

N(A)表示A用户喜欢的商品集合,N(B)表示B用户喜欢的商品集合;分子是两个集合的交集表示,他们喜欢商品的重合数量。这个式子类似三角函数的余弦夹角,在 相关性与相似度 中介绍了通过余弦夹角计算相似度详细解释。

解决另一种机端可能,在推荐应用的商品中,有一些公共产品,比如商品中的盐,酱油,大米,几乎每个人都会买的东西,不能表示出他们的喜好程度相似。用户A和用户B都会有一些这种公共的产品,导致他们 N(A) ∩ \cap N(B) 过大从而导致喜好程度就会变大。这是需要提出一个公式,希望能够具有惩罚性质的公式,对这种会提高喜好程度进行降分惩罚。

公式: W A B W_{AB} WAB = ∑ i ∈ N ( A ) ∩ N ( B ) 1 l o g ( 1 + ∣ N ( i ) ∣ ) ∣ N ( A ) ∣ ∣ N ( B ) ∣ \frac{ \sum_{i\in N(A) \cap N(B)} \frac{1} {log(1+|N(i)|)} }{\sqrt{|N(A)||N(B)|}} N(A)N(B) iN(A)N(B)log(1+N(i))1

i ∈ \in N(A) ∩ \cap N(B) 中的i表示,用户A与用户B共有的产品集合

上式中的 N(i) 表示 i产品 被多少用户所喜欢,N(A) 表示用户A有多少喜欢的商品,同理N(B)也是这种情况。

ItemCF介绍

已经知道UserCF表示的是,如同: 用户A用户B 共同喜欢产品 能够决定他们的相似程度;那么ItemCF也是同理,因为产品不能去喜欢人只能被喜欢,所以 产品A产品B 被多少共同被喜欢的用户量,即 N(A) ∩ \cap N(B)。

同理可以得到: W A B W_{AB} WAB = N ( A ) ∩ N ( B ) ∣ N ( A ) ∣ ∣ N ( B ) ∣ \frac{N(A) \cap N(B)}{\sqrt{|N(A)| |N(B)|}} N(A)N(B) N(A)N(B) ,如果某个产品被是可能是公共产品被很多用户喜欢,那么也需要引入一个惩罚机制。

公式: W A B W_{AB} WAB = ∑ i ∈ N ( A ) ∩ N ( B ) 1 l o g ( 1 + ∣ N ( i ) ∣ ) ∣ N ( A ) ∣ ∣ N ( B ) ∣ \frac{ \sum_{i\in N(A) \cap N(B)} \frac{1} {log(1+|N(i)|)} }{\sqrt{|N(A)||N(B)|}} N(A)N(B) iN(A)N(B)log(1+N(i))1 与上面UserCF的惩罚公式类似。

只不过 N(i) 表示的是用户i 有多少喜欢的产品,N(A)与N(B)表示的是 产品A产品B 被多少用户所喜欢。

UserCF与ItemCF的实现

我已经对协同过滤推荐算法用Java进行实现,优化了稀疏矩阵的创建过程,您可以查看该代码 https://github.com/NihaoRay/CRecommend

水平有限,可能存在错误,希望指出,谢谢!

猜你喜欢

转载自blog.csdn.net/Hello_Ray/article/details/109313306
今日推荐