一. 协同过滤推荐算法(基于邻域的算法)
1. 算法分类
- 基于用户的协同算法:
跟你喜好相似的人喜欢的东西你也很有可能喜欢 - 基于物品的协同算法:
跟你喜欢的东西相似的东西你也很有可能喜欢
1.1 实现协同过滤推荐有以下几个步骤:
- 找出最相似的人或物品:Top-N 相似的人或物品
通过计算两两的相似度来进行排序,即可找出TOP-N相似的人或物品 - 根据相似的人或物品产生推荐结果
利用TOP-N结果生成初始推荐结果,然后过滤掉用户已经有过记录的物品或明确表示不感兴趣的物品
1.2 基于用户的协同算法
基于用户的协同过滤算法是推荐系统中最古老的算法
1.2.1 基础算法
当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。这种方法称为基于用户的协同过滤算法。
用户的协同过滤算法主要包括两个步骤:
- 找到和目标用户兴趣相似的用户集合
- 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户
步骤(1)的关键就是计算两个用户的兴趣相似度,协同过滤算法主要利用行为的相似度计算兴趣的相似度 ,给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v) 为用户v曾经有过正反馈的物品集合。那么,我们可以通过如下的Jaccard公式简单地计算u和v的兴趣相似度:
$$W_{uv}=\frac{|N(_u)\cup N(_v)|}{|N(_u)\cap N(_v)|}$$
或者通过余弦相似度计算:
$$ W_{uv}=\frac{|N(u)\cap N(_v)|}{\sqrt{|N(_u)||N(_v)}}$$
计算案例:
- Jaccard 公式计算:
$$\frac{|\{a,b,d\}\cap\{a,c\}}{|\{a,b,d\}\cup\{a,c\}|}$$
结果:
$$\frac{\{a\}}{\{a,b,c,d\}}=\frac{1}{4}$$ - 余弦相似度计算:
$$\frac{|\{a,b,d\}\cap\{a,c\}|}{\sqrt{|\{a,b,d\}||\{a,c\}|}}=\frac{1}{\sqrt{6}}$$
同理:
$$W_{AC}=\frac{|\{a,b,d\}\cap\{b,e\}|}{\sqrt{|\{a,b,d\}||\{b,e\}|}}=\frac{1}{\sqrt6}$$
$$W_{AD}=\frac{|\{a,b,d\}\cap\{c,d,e\}|}{\sqrt{|\{a,b,d\}||\{c,d,e\}|}}=\frac{1}{3}$$
1.2.1 算法实现
jaccard 算法:
def jaccard(train): W=dict() # 计算两两用户之间的相似度 for u in train: for v in train: # 如果是同一个用户跳过 if u==v: continue # 两个用户点击物品的交集 cap=train[u]&train[v] # 两个用户点击物品的并集 cup=train[u]|train[v] # 两个用户的相似度 W[u,v]=len(cap)/len(cup) return W
余弦公式代码实现
def UserSimilarity(train): W=dict() # 计算两两用户之间的相似度 for u in train: for v in train: # 如果是同一个用户跳过 if u==v: continue # 两个用户点击物品的交集 W[u,v]=len(train[u] & train[v]) # 两个用户相似度 W[u,v]/=math.sqrt(len(train[u])*len(train[v])) return W
二. 隐语义模型(LFM(latent factor model)
核心思想是通过隐含特征 (latent factor)联系用户兴趣和物品
图2-16展示了两个用户在豆瓣的读书列表。从他们的阅读列表可以看出,用户A的兴趣涉及侦探小说、科普图书以及一些计算机技术书, 而用户B的兴趣比较集中在数学和机器学习方面。 那么如何给A和B推荐图书呢?- 基于UserCF,首先找到他们看过同样书籍的其他用户,然后推荐那些用户喜欢的书籍
- 对于ItemCF,需要计算书籍相似度,然后推荐给用户
还有一种方法,可以对书和物品的兴趣进行分类。对于某个用户,首先得到他的兴趣分类, 然后从分类中挑选他可能喜欢的物品。
基于兴趣分类的方法大概需要解决3个问题:
- 如何给物品进行分类
- 如何确定用户对哪些物品感兴趣,以及感兴趣的程度
- 对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重
第一个问题的简单解决方案是认为进行分类,但是人为分类有以下缺点:
- 分类过于主观片面,每个人对同一件物品可能有不同的分类
- 分类粒度难以控制:对于不同的用户,我们可能需要不同的粒度。
- 同一个物品可能属于对个分类
- 很难给出多维度分类:分类是可以有很多维度的,比如按照作者分类、 按照译者分类、按照出版社分类
- 很难决定一个物品在某一个分类中的权重
所以为了解决物品分类的问题:隐含语义分析技术(latent variable analysis) 出现了,隐含语义分析技术因为采取基于用户行为统计的自动聚类,较好地解决了上面提出的5个问题:
- 分类过于主观片面:但隐含语义分析技术的分类来自对用户行为的统计,代表了用户对物品分类的看法。隐含语义分析技术和ItemCF在物品分类方面的思想类似,如果两个物品被很多用户同时喜欢,那么这两个物品就很有可能属于同一个类。
- 分类粒度难以控制:但隐含语义分析技术允许我们指定最终有多少个分类
- 很难给一个物品多个分类:但隐含语义分析技术会计算出物品属于每个类的权重,因此每个物品都不是硬性地被分到某一个类中。
- 很难给出多维度的分类:但隐含语义分析技术给出的每个分类都不是同一个维度的,它是基于用户的共同兴趣计算出来的,如果用户的共同兴趣是某一个维度,那么LFM给出的类也是相同的维度。
- 很难决定一个物品在某一个分类中的权重,但隐含语义分析技术可以通过统计用户行为决定物品在每个类中的权重,如果喜欢某个类的用户都会喜欢某个物品,那么这个物品在这个类中的权重就可能比较高。
隐含语义分析技术从诞生到今天产生了很多著名的模型和方法,其中和该技术相关且耳熟能详的名词有 pLSA、LDA、隐含类别模型(latent class model)、隐含主题模型(latent topic model)、 矩阵分解(matrix factorization)。这些技术和方法在本质上是相通的,其中很多方法都可以用于个性化推荐系统。
以LFM为例:
$$Preference(u,i)=r_{ui}=p_u^Tq_i=\sum^{F}_{f=1}p_{u,k}q_{i,k}$$
其中\(p_{u,k}\)度量了用户u的兴趣和第k个隐类的关系,\(q_{i,k}\)度量了第k个隐类和物品i之间的关系
这两个参数是从数据集中计算出来的。要计算这两个参数,需要一个训练集,对于每个用户u,训练
集里都包含了用户u喜欢的物品和不感兴趣的物品,通过学习这个数据集,就可以获得上面的模型参数。
在隐性反馈数据集上应用LFM解决TopN推荐的第一个关键问题就是如何给每个用户生成负样本。
生成负样本有以下几种选择:
- 用他所有没有过行为的物品作为负样本
- 从他没有过行为的物品中均匀采样出一些物品作为负样本
- 从他没有过行为的物品中采样出一些物品作为负样本,但采样时,保证每个用户的正负样本数目相当
- 从他没有过行为的物品中采样出一些物品作为负样本,但采样时,偏重采样不热门的物品
实验证明:第三种选择优于其他选择
现对负样本采样时应该遵循以下原则。
- 对每个用户,要保证正负样本的平衡(数目相似)。
- 对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。