第07课:协同推荐(原理)

在上面的四个章节里,我们分别对推荐算法中的基于内容的推荐和基于用户画像的推荐逻辑做了简单了解,从算法原理到示例逻辑,再到工程代码讲解,并且将算法逻辑从与用户无关逐渐过渡到用户的兴趣相关推荐。

单纯基于画像推荐的缺陷

并且,我们大致 Get 到了一个点,那就是如果要达到推荐个性化的目的,核心还是用户的行为数据,只有用户各自的行为数据才能反馈其与其他人所不一样的特性,从而有针对性的进行推荐。

按上个章节的节奏,大致就是这样的:

实际上基于用户画像的个性化推荐依然是有缺陷的,比如他不会做用户兴趣的升级,而实际上一些知识本身就是具有一定的阶梯性的。

举个例子就很容易理解了,比如,你对大数据的东西很感兴趣,于是系统根据你的兴趣偏好天天给你推 Hadoop、大数据各种技术框架等信息,在某个时间段可能是合理,比如我对大数据领域已经熟知了,还天天推送大数据相关的信息就不合适了。

而实际上是需要寻求大数据关联的信息,甚至是升级的信息,比如基于大数据的机器学习、数据挖掘相关的东西,这个机制是无法做到这一层的。

说白了其实就是基于用户画像的推荐,他无法发现新知识,所谓新知识就是,与你之前的兴趣爱好相对比,推荐的候选集永远圈定在你的兴趣标签维度内,做不到认知的升级,而实际上认知是会进行升级的,特别是随着你捕获的知识信息越多的情况下,你就越会对更上层的其他知识感兴趣,不断地深入下去。

还记得我们在基础知识章节里学习到的“信息茧房”的概念吗?实际上如果过渡依赖于基于用户兴趣的推荐,就会容易陷入信息茧房的问题中,核心原因就在于,兴趣得不到升华,逐渐地将获取地信息进行了范围限制。

而基于协同过滤的推荐,或多或少能解决一点这类问题,最起码能够结合本身用户的行为,让你触达新的知识信息,并且这种递进是通过协同关系得到的,意味着是大部分人的共同选择,所以还是具有一定合理性的。

协同过滤的原理

对于基于协同过滤的推荐,可谓是推荐系统中的经典推荐算法了,记得好像就是亚马逊推广出来的,然后大放光彩。协同过滤又分为基于用户的协同(UserCF)、基于物品的协同(ItemCF),以及基于模型的协同(ModelCF)。

基于用户的协同过滤推荐(UserCF)

基于用户的协同过滤,即我们希望通过用户之间的关系来达到推荐物品的目的,于是,给某用户推荐物品,即转换为寻找为这个用户寻找他的相似用户,然后相似用户喜欢的物品,那么也可能是这个用户喜欢的物品(当然会去重)。

我们先来看一个表格:

1-3

其中,Y 表示对应用户喜欢对应物品,- 表示无交集,?表示需不需要推荐。

这是一个最简单的例子,其实目的很简单,我们需要给用户 A 推荐物品,而且可以看到,用户已经喜欢了物品 A 和物品 C,其实剩下也就 B 和 D 了,要么是 B,要么是 D。那么根据 UserCF 算法,我们先计算用户 A 与用户 BC 之间的相似度,计算相似,我们前文说了,要么距离,要么余弦夹角。

假如我们选择计算夹角(四维):cosAB=0(90°的夹角),cosAC=0.8199(角度自己算吧)。所以相比来说,会发现用户 A 与用户 C 的相似度是稍微大一些的。于是,我们观察用户 C 都喜欢了哪些物品,然后与用户的去重,然后会发现该给用户 A 推荐物品 D。

简单来讲,UserCF 就是如上过程,但在实际的过程中,数据量肯定不止这么点,于是我们需要做的是为用户计算出相似用户列表,然后在相似用户中经过去重之后,计算一个推荐的物品列表(在计算推荐物品的时候,可以叠加用户的相似程度进一步叠加物品的权重)。

然后在喜欢物品的表达形式上,可以是如上的这种二值分类,即 Yes Or No,也可以是带有评分的程度描述,比如对于某个物品打多少分的这种表现形式。这样的话,针对于后一种情况,我们就需要在求在计算相似度时,加入程度的权重考量。

基于物品的协同推荐(ItemCF)

不同于基于用户的协同,这里,我们计算的是物品之间的相似度,但是,请注意,计算物品相似度的时候,与直接基于物品相似度推荐不同时,所用的特征并不是物品的自身属性,而依然是用户行为。

2-3

其中,Y 表示对应用户喜欢对应物品,- 表示无交集,?表示需不需要推荐。

同样,这是一个简单实例。目的也明确,我们在知道用户 AB 喜欢某些物品情况,以及在用户 C 已经喜欢物品 C 的前提下,为用户 C 推荐一个物品。看表格很简单嘛,只有两个选项,要么物品 B,要么物品 C。那么到底是物品 B 还是物品 C 呢?

我们来计算物品 A 与其他两种物品的相似度,计算向量夹角。对于用户 A,物品 A 与物品 B,则对于 AB 向量为(1,0)、(1,1),对于 AC 向量为 (1,1)、(1,1),分别计算夹角 cosAB=0.7、cosAC=1,或者用类似关联规则的方法,计算两者之间的共现,例如 AB 共现 1 次,AC 共现 2 次。通过类似这种方式,我们就知道物品 A 与物品 C 在某种程度上是更相似的。

我要说的就是类似共现类做计算的这种方式,在大规模数据的情况下是很有效的一种方式,基于统计的方法在数据量足够的时候,更能体现问题的本质。

基于模型的协同推荐(ModelCF)

除了我们熟悉的基于用户以及基于物品的协同,还有一类基于模型的协同过滤。基于模型的协同过滤推荐,基于样本的用户偏好信息,训练一个模型,然后根据实时的用户喜好信息进行预测推荐。常见的基于模型推荐又有三种:最近邻模型,典型如 K 最近邻;SVD 模型,即矩阵分解;图模型,又称为社会网络图模型。

1. 最近邻模型

最近邻模型,即使用用户的偏好信息,我们计算当前被推荐用户与其他用户的距离,然后根据近邻进行当前用户对于物品的评分预测。

典型如 K 最近邻模型,假如我们使用皮尔森相关系数,计算当前用户与其他所有用户的相似度 sim,然后在 K 个近邻中,通过这些相似用户,预测当前用户对于每一个物品的评分,然后重新排序,最终推出 M 个评分最高的物品推荐出去。需要注意的是,基于近邻的协同推荐,较依赖当前被推荐用户的历史数据,这样计算出来的相关度才更准确。

2. SVD 矩阵分解

我们把用户和物品的对应关系可以看做是一个矩阵 X,然后矩阵 X 可以分解为 X=A*B。而满足这种分解,并且每个用户对应于物品都有评分,必定存在与某组隐含的因子,使得用户对于物品的评分逼近真实值,而我们的目标就是通过分解矩阵得到这些隐性因子,并且通过这些因子来预测还未评分的物品。

有两种方式来学习隐性因子,一为交叉最小二乘法,即 ALS;而为随机梯度下降法。首先对于 ALS 来说,首先随机化矩阵 A,然后通过目标函数求得 B,然后对 B 进行归一化处理,反过来求 A,不断迭代,直到 A*B 满足一定的收敛条件即停止。

对于随机梯度下降法来说,首先目标函数是凹函数或者是凸函数,我们通过调整因子矩阵使得目标沿着凹函数的最小值,或者凸函数的最大值移动,最终到达移动阈值或者两个函数变化绝对值小于阈值时,停止因子矩阵的变化,得到的函数即为隐性因子。

使用分解矩阵的方式进行协同推荐,可解释性较差,但是使用 RMSE(均方根误差)作为评判标准,较容易评判。

并且,我们使用这种方法时,需要尽可能的让用户覆盖物品,即用户对于物品的历史评分记录需要足够的多,模型才更准确。

3. 社会网络图模型

所谓社会网络图模型,即我们认为每个人之间都是有联系的,任何两个用户都可以通过某种或者多个物品的购买行为而联系起来,即如果一端的节点是被推荐用户,而另一端是其他用户,他们之间通过若干个物品,最终能联系到一起。

而我们基于社会网络图模型,即研究用户对于物品的评分行为,获取用户与用户之间的图关系,最终依据图关系的距离,为用户推荐相关的物品。目前这种协同推荐使用的较少。

最后

基于上面的理论逻辑,我们将继续延续上两课内容的思路,仍然结合公开的电影数据集进行工程示例讲解,来加深大家对算法的理解。

但是鉴于篇幅,以及协同过滤本身涉及多个算法,第08课将着重进行基于模型协同的算法工程示例讲解,即集成在 Spark 2.0 中的基于 ALS 的推荐。

(全文完)

(转载本站文章请注明作者和出处 第07课:协同推荐(原理)