导航:首页 > 净水问答 > 协同过滤共现矩阵

协同过滤共现矩阵

发布时间:2023-02-05 07:56:06

⑴ 矩阵分解在协同过滤推荐算法中的应用

矩阵分解在协同过滤推荐算法中的应用
推荐系统是当下越来越热的一个研究问题,无论在学术界还是在工业界都有很多优秀的人才参与其中。近几年举办的推荐系统比赛更是一次又一次地把推荐系统的研究推向了高潮,比如几年前的Neflix百万大奖赛,KDD CUP 2011的音乐推荐比赛,去年的网络电影推荐竞赛,还有最近的阿里巴巴大数据竞赛。这些比赛对推荐系统的发展都起到了很大的推动作用,使我们有机会接触到真实的工业界数据。我们利用这些数据可以更好地学习掌握推荐系统,这些数据网上很多,大家可以到网上下载。
推荐系统在工业领域中取得了巨大的成功,尤其是在电子商务中。很多电子商务网站利用推荐系统来提高销售收入,推荐系统为Amazon网站每年带来30%的销售收入。推荐系统在不同网站上应用的方式不同,这个不是本文的重点,如果感兴趣可以阅读《推荐系统实践》(人民邮电出版社,项亮)第一章内容。下面进入主题。
为了方便介绍,假设推荐系统中有用户集合有6个用户,即U={u1,u2,u3,u4,u5,u6},项目(物品)集合有7个项目,即V={v1,v2,v3,v4,v5,v6,v7},用户对项目的评分结合为R,用户对项目的评分范围是[0, 5]。R具体表示如下:

推荐系统的目标就是预测出符号“?”对应位置的分值。推荐系统基于这样一个假设:用户对项目的打分越高,表明用户越喜欢。因此,预测出用户对未评分项目的评分后,根据分值大小排序,把分值高的项目推荐给用户。怎么预测这些评分呢,方法大体上可以分为基于内容的推荐、协同过滤推荐和混合推荐三类,协同过滤算法进一步划分又可分为基于基于内存的推荐(memory-based)和基于模型的推荐(model-based),本文介绍的矩阵分解算法属于基于模型的推荐。
矩阵分解算法的数学理论基础是矩阵的行列变换。在《线性代数》中,我们知道矩阵A进行行变换相当于A左乘一个矩阵,矩阵A进行列变换等价于矩阵A右乘一个矩阵,因此矩阵A可以表示为A=PEQ=PQ(E是标准阵)。
矩阵分解目标就是把用户-项目评分矩阵R分解成用户因子矩阵和项目因子矩阵乘的形式,即R=UV,这里R是n×m, n =6, m =7,U是n×k,V是k×m。直观地表示如下:

高维的用户-项目评分矩阵分解成为两个低维的用户因子矩阵和项目因子矩阵,因此矩阵分解和PCA不同,不是为了降维。用户i对项目j的评分r_ij =innerproct(u_i, v_j),更一般的情况是r_ij =f(U_i, V_j),这里为了介绍方便就是用u_i和v_j内积的形式。下面介绍评估低维矩阵乘积拟合评分矩阵的方法。
首先假设,用户对项目的真实评分和预测评分之间的差服从高斯分布,基于这一假设,可推导出目标函数如下:

最后得到矩阵分解的目标函数如下:

从最终得到得目标函数可以直观地理解,预测的分值就是尽量逼近真实的已知评分值。有了目标函数之后,下面就开始谈优化方法了,通常的优化方法分为两种:交叉最小二乘法(alternative least squares)和随机梯度下降法(stochastic gradient descent)。
首先介绍交叉最小二乘法,之所以交叉最小二乘法能够应用到这个目标函数主要是因为L对U和V都是凸函数。首先分别对用户因子向量和项目因子向量求偏导,令偏导等于0求驻点,具体解法如下:

上面就是用户因子向量和项目因子向量的更新公式,迭代更新公式即可找到可接受的局部最优解。迭代终止的条件下面会讲到。
接下来讲解随机梯度下降法,这个方法应用的最多。大致思想是让变量沿着目标函数负梯度的方向移动,直到移动到极小值点。直观的表示如下:

其实负梯度的负方向,当函数是凸函数时是函数值减小的方向走;当函数是凹函数时是往函数值增大的方向移动。而矩阵分解的目标函数L是凸函数,因此,通过梯度下降法我们能够得到目标函数L的极小值(理想情况是最小值)。
言归正传,通过上面的讲解,我们可以获取梯度下降算法的因子矩阵更新公式,具体如下:

(3)和(4)中的γ指的是步长,也即是学习速率,它是一个超参数,需要调参确定。对于梯度见(1)和(2)。
下面说下迭代终止的条件。迭代终止的条件有很多种,就目前我了解的主要有
1) 设置一个阈值,当L函数值小于阈值时就停止迭代,不常用
2) 设置一个阈值,当前后两次函数值变化绝对值小于阈值时,停止迭代
3) 设置固定迭代次数
另外还有一个问题,当用户-项目评分矩阵R非常稀疏时,就会出现过拟合(overfitting)的问题,过拟合问题的解决方法就是正则化(regularization)。正则化其实就是在目标函数中加上用户因子向量和项目因子向量的二范数,当然也可以加上一范数。至于加上一范数还是二范数要看具体情况,一范数会使很多因子为0,从而减小模型大小,而二范数则不会它只能使因子接近于0,而不能使其为0,关于这个的介绍可参考论文Regression Shrinkage and Selection via the Lasso。引入正则化项后目标函数变为:

(5)中λ_1和λ_2是指正则项的权重,这两个值可以取一样,具体取值也需要根据数据集调参得到。优化方法和前面一样,只是梯度公式需要更新一下。
矩阵分解算法目前在推荐系统中应用非常广泛,对于使用RMSE作为评价指标的系统尤为明显,因为矩阵分解的目标就是使RMSE取值最小。但矩阵分解有其弱点,就是解释性差,不能很好为推荐结果做出解释。
后面会继续介绍矩阵分解算法的扩展性问题,就是如何加入隐反馈信息,加入时间信息等。

⑵ 矩阵分解

为什么要进行矩阵分解?
1、从矩阵变换的角度:
将复合变换后的矩阵分解成基本变换过程。具体请看奇异值分解之矩阵变换角度。
2、从 研究动机 的角度:

首先要理解基变换(坐标变换)再理解特征值的本质。
1、如果一个矩阵的行列式为0(非满秩),其特征值为0,这个证明比较简单:

(单位矩阵有时候用 表示,有时候用 表示。)




如果 ,那么 ,进而
2、对于一个 的矩阵 ,其 ;
3、主对角线上的元素都不为0,其他元素都为0的矩阵叫对角矩阵,对角矩阵一定是正交矩阵,即其基两两垂直。

特征值分解就是矩阵的对角化,就是可以将 分解为 , 是由对应特征向量组成的矩阵--特征矩阵, 为对角矩阵,对角线上的元素为 的特征值。只有在一定条件下,一个变换可以由其特征值和特征向量完全表述,也就是说: 所有的特征向量组成了空间的一组基 。并不是所有方阵都可以对角化,方阵 可以被对角化的条件是 :

正交矩阵一定可以对角化 。以三维空间为例,正交矩阵就是歪着的立方体,对角化就是把这个立方体摆正(就是让它的某一个顶点放在原点上,同时这个顶点的三条边放在三条坐标轴上)。对角矩阵就是摆正后的立方体。

机器学习中的特征值分解, 往往是协方差矩阵,如PCA,所以我们要确保各个特征之间是线性无关的。

如何通俗地理解奇异值?

我们知道一个向量张成的空间是一条直线, 任意实数 可以得到非零向量 张成的空间是一条直线。那么如果一个 维空间中的向量 其所张成的空间——一条直线上的点,经过一个矩阵 变换到另一个 的空间中依然在同一条直线上,这个直线是 空间中的向量 所张成的空间,只是会有对应的缩放,这个缩放的程度就是奇异值。用数学形式表达为: , 是 空间中的向量, 是 的变换矩阵, 是 空间中的向量, 就是奇异值。

可以感觉到特征值是奇异值的特例,当m=n且 和 重叠的时候(方向可以不同),奇异值=特征值。

奇异值分解计算例子:
https://www.cnblogs.com/marsggbo/p/10155801.html

https://www.hu.com/question/22237507
https://blog.csdn.net/bitcarmanlee/article/details/52662518
https://blog.csdn.net/billbliss/article/details/78559289

SVD(奇异值分解)Python实现: https://www.cnblogs.com/endlesscoding/p/10058532.html

矩阵分解为了解决传统协同过滤处理稀疏共现矩阵能力差的问题。使用矩阵分解相比传统协同过滤也提升了泛化性。

基于矩阵分解的模型又叫潜在因素模型、隐语义模型。

矩阵分解的开端是2006年的Netflix竞赛。

1、推荐系统中:
分解的是什么矩阵?共现矩阵
怎么共现矩阵分解?
1)特征值分解
要求待分解的是方阵,所以行不通
2)奇异值分解
要求待分解矩阵是稠密矩阵,而共现矩阵是稀疏矩阵,所以不行;
奇异值分解的复杂度是 ,复杂度很高,也不合适。
3)梯度下降法——也就是交替最小二乘法(alternating least squares,ALS),解决两个变量求解。
使用梯度下降法进行矩阵分解
(1)确定目标函数: ,就是一个MSE;
(2)分别对 和 求偏导
(3)参数更新
(4)迭代
得到隐向量后,对某个用户进行推荐时,利用该用户的隐向量与所有物品的隐向量进行逐一内积运算,得到该用户对所有物品的得分,再进行排序,得到最终的推荐列表。
4)贝叶斯矩阵分解
https://zhuanlan.hu.com/p/26067454

2、PCA---奇异值分解

⑶ 协同过滤与分类

[TOC]

本文是《写给程序员的数据挖掘实践指南》的一周性笔记总结。主要涵盖了以下内容:

所谓推荐系统就是系统根据你的行为操作为你推荐你可能想要的其他物品。这在电商平台、音乐平台、资讯推送平台等多有见到。而协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息。其推荐基础是用户评分。这里可以分为两种用户评分,即显式评分与隐式评分。显式评分即日常见到的为物品打分,如对喜好音乐评级等;隐式评分是通过对用户行为的持续性观察,进而发现用户偏好的一种方法,如新闻网页中的推送你经常阅读过的相关内容等。两种评分方法都有自己的问题。

总体来说,协同过滤其运作机制也可以分为两种:

基于用户的推荐是指通过用户的行为偏好,划分相似用户。在相似用户群体之间互相推送一方喜欢而另一方未有过的物品。核心在于相似用户群体的划分。这种推荐方法有自己的局限:

基于用户的过滤其核心是用户群体的划分,其实也就是分类。

这里的距离函数包括三种:曼哈顿距离和欧氏距离。这里以二维举例,更多维情况下类推即可。

两距离函数可以一般化为:

其中,当r=1时,函数为曼哈顿距离;当r=2时,函数为欧氏距离。

算法实现:

在算出距离函数后,通过比对目标用户与所有用户群体的偏好,找到最近邻的用户并给予推荐。

基于用户距离的推荐有一个明显的问题,就是用户评分体系的差异。比如评分极端的用户给喜欢的评最高分,给不喜欢的评最低分;而有些用户倾向于不出现极端评分。即所谓“分数贬值”( Grade Inflation )问题。这种问题的存在可能让基于距离的评分产生偏差。皮尔逊相关系数可以缓解这种问题。

原皮尔逊相关系数公式在实际运用的时候会出现多次迭代的问题,影响计算效率,这里给出了近似公式:

皮尔逊相关系数的用户判断依据不是单纯的用户距离,而是用户的评分一致性:取值在[-1, 1]之间,越接近1则表示两用户的评分一致性越好;反之则反。
python实现:

基于用户推荐的过程中,另一个存在的问题就是由于大部分人的喜爱物品集合的交集过少,存在大量计算值为0的feature的情况。即所谓 稀疏性 问题。一个较容易理解的例子是对书本内容的挖掘。余弦相似度会忽略这种0-0匹配。
余弦相似度:

python实现:

如此多的评估系数,如何进行抉择呢?根据数据特征:

另外值得考虑的一点是,目前为止的推荐都是基于单用户的。即对一个用户的推荐系统只是基于另一个用户。这会存在一些问题。比如虽然虽然两者相似度很高,但是另外一个人有一些怪癖,怪癖的推荐就是不合理的;又比如,在相似度极高的情况下,你不能确定统一账户下的操作是同一个人做出的或者说操作行为是为了用户自身。比如用户考虑购买某件商品作为礼物送给别人,这就是基于别人喜好的购买行为,这种推荐也是不合适的。
对这种问题的解决可以使用群体划分的方法。原理与单用户类似,但是用户的匹配是k个。在这k位最优匹配的用户之间,以相似度的大小为依据设定权重作为物品推荐的条件。此即协同过滤的k近邻。

正如前面提到的基于用户的推荐有复杂度、稀疏性的问题,而基于物品的过滤则可以缓解这些问题。所谓基于物品的过滤是指,我们事先找到最相似的物品,并结合用户对物品的评级结果来生成推荐。前提是要对物品进行相似度匹配,找到一种算法。

这里的调整是指为了减轻用户评分体系的不一致情况(抵消分数贬值),从每个评级结果中减去该用户所有物品的平均分的评级结果。

其中,U表示所有同时对i, j进行评级过的用户的集合。 表示用户u给物品i的评分减去用户u对所有物品的评分的平均值。

在得到所有物品的余弦相似度后,我们就可以通过该指数预测用户对某件物品的偏好程度。方法就是所有相似物品的相似度乘以得分的总和。

其中p(u, i)指的是用户u对物品i评分的预测值。N是用户u的所有评级物品中每个和i得分相似的物品。这里的相似指的是矩阵中存在N和i的一个相似度得分。 是i和N之间的相似度得分。 是u给N的评级结果。公式较好运行的条件是 取值在(-1, 1)之间,这里就要使用归一化概念。

另一种常用的基于物品过滤的算法就是 slope one 算法。它的大概原理是预测用户u对产品j的评分时,预先计算包含所有物品的两物品偏差表;根据u的已评价的所有物品评分与该物品和产品j的偏差( )之和并乘以所有对此两类物品有过评分的用户个数,一一加总,除以所有同时对产品i与u评价过的所有物品有过评分的用户的人数,得到得分。公式如下:

其中, ; 是利用加权s1算法给出的用户u对物品j的预测值。 指的是对所有除j之外u打过分的物品。

python实现:

在前面两节中,基于物品和基于用户的过滤其前提都是用户需要对已有的item进行评分。而实际上,如果一个新的item出现,由于缺乏别人的偏好,他永远不会被推荐。这就是推荐系统中所谓的—— 冷启动 问题。基于用户评价的系统就会出现这种问题。
冷启动 问题的解决方案之一就是 基于物品属性的过滤 来进行推荐:对物品自身的属性进行归纳总结,并以此进行物品推荐。基于物品属性的过滤存在一个问题同样是量纲的不统一。如果量纲不统一极端值将会对推荐系统造成大麻烦。解决方法也很简单:归一化。此章使用的是z-评分。
使用z得分也存在问题,就是极易受到离群值的影响。这里可以使用 改进的标准分数 来缓解这个问题:

什么时候可以进行归一化呢?

这里用曼哈顿距离举例基于物品属性的过滤:

在上一章最后一节对于用户是否喜欢某件item的判别中,实际上包含了分类器的思想:分类器就是利用对象属性判定对象属于哪个组或类别的程序。这里简单用另一个小项目来说明。

简单来说就是根据运动员的某些指标来判断这位运动员属于什么类别的运动员。

准确率有0.8。

⑷ https://.baidu.com/question/2270990967816553188.html

整理一下自己的理解。
对于一个users-procts-rating的评分数据集,ALS会建立一个user*proct的m*n的矩阵
其中,m为users的数量,n为procts的数量
但是在这个数据集中,并不是每个用户都对每个产品进行过评分,所以这个矩阵往往是稀疏的,用户i对产品j的评分往往是空的
ALS所做的事情就是将这个稀疏矩阵通过一定的规律填满,这样就可以从矩阵中得到任意一个user对任意一个proct的评分,ALS填充的评分项也称为用户i对产品j的预测得分
所以说,ALS算法的核心就是通过什么样子的规律来填满(预测)这个稀疏矩阵
它是这么做的:
假设m*n的评分矩阵R,可以被近似分解成U*(V)T
U为m*d的用户特征向量矩阵
V为n*d的产品特征向量矩阵((V)T代表V的转置,原谅我不会打转置这个符号。。)
d为user/proct的特征值的数量

关于d这个值的理解,大概可以是这样的
对于每个产品,可以从d个角度进行评价,以电影为例,可以从主演,导演,特效,剧情4个角度来评价一部电影,那么d就等于4
可以认为,每部电影在这4个角度上都有一个固定的基准评分值
例如《末日崩塌》这部电影是一个产品,它的特征向量是由d个特征值组成的
d=4,有4个特征值,分别是主演,导演,特效,剧情
每个特征值的基准评分值分别为(满分为1.0):
主演:0.9(大光头还是那么霸气)
导演:0.7
特效:0.8
剧情:0.6
矩阵V由n个proct*d个特征值组成

对于矩阵U,假设对于任意的用户A,该用户对一部电影的综合评分和电影的特征值存在一定的线性关系,即电影的综合评分=(a1*d1+a2*d2+a3*d3+a4*d4)
其中a1-4为用户A的特征值,d1-4为之前所说的电影的特征值
参考:
协同过滤中的矩阵分解算法研究

那么对于之前ALS算法的这个假设
m*n的评分矩阵R,可以被近似分解成U*(V)T
就是成立的,某个用户对某个产品的评分可以通过矩阵U某行和矩阵V(转置)的某列相乘得到

那么现在的问题是,如何确定用户和产品的特征值?(之前仅仅是举例子,实际中这两个都是未知的变量)
采用的是交替的最小二乘法
在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另外一部分表示用户i的特征向量(转置)*产品j的特征向量(这里可以得到预测的i对j的评分)在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另外一部分表示用户i的特征向量(转置)*产品j的特征向量(这里可以得到预测的i对j的评分)
用真实评分减去预测评分然后求平方,对下一个用户,下一个产品进行相同的计算,将所有结果累加起来(其中,数据集构成的矩阵是存在大量的空打分,并没有实际的评分,解决的方法是就只看对已知打分的项)
参考:
ALS 在 Spark MLlib 中的实现
但是这里之前问题还是存在,就是用户和产品的特征向量都是未知的,这个式子存在两个未知变量

解决的办法是交替的最小二乘法
首先对于上面的公式,以下面的形式显示:
为了防止过度拟合,加上正则化参数为了防止过度拟合,加上正则化参数
首先用一个小于1的随机数初始化V首先用一个小于1的随机数初始化V
根据公式(4)求U
此时就可以得到初始的UV矩阵了,计算上面说过的差平方和
根据计算得到的U和公式(5),重新计算并覆盖V,计算差平方和
反复进行以上两步的计算,直到差平方和小于一个预设的数,或者迭代次数满足要求则停止
取得最新的UV矩阵
则原本的稀疏矩阵R就可以用R=U(V)T来表示了
以上公式内容截图来自:
基于矩阵分解的协同过滤算法

总结一下:
ALS算法的核心就是将稀疏评分矩阵分解为用户特征向量矩阵和产品特征向量矩阵的乘积
交替使用最小二乘法逐步计算用户/产品特征向量,使得差平方和最小
通过用户/产品特征向量的矩阵来预测某个用户对某个产品的评分

不知道是不是理解正确了
有几个问题想请教一下~

⑸ 协同过滤算法

用户行为数据在网站上最简单的存在形式就是日志,比如用户在电子商务网站中的网页浏览、购买、点击、评分和评论等活动。 用户行为在个性化推荐系统中一般分两种——显性反馈行为(explicit feedback)和隐性反馈 行为(implicit feedback)。显性反馈行为包括用户明确表示对物品喜好的行为。网站中收集显性反馈的主要方式就是评分和喜欢/不喜欢。隐性反馈行为指的是那些不能明确反应用户喜好 的行为。最具代表性的隐性反馈行为就是页面浏览行为。 按照反馈的明确性分,用户行为数据可以分为显性反馈和隐性反馈,但按照反馈的方向分, 又可以分为正反馈和负反馈。正反馈指用户的行为倾向于指用户喜欢该物品,而负反馈指用户的 行为倾向于指用户不喜欢该物品。在显性反馈中,很容易区分一个用户行为是正反馈还是负反馈, 而在隐性反馈行为中,就相对比较难以确定。

在利用用户行为数据设计推荐算法之前,研究人员首先需要对用户行为数据进行分析,了解 数据中蕴含的一般规律,这样才能对算法的设计起到指导作用。

(1) 用户活跃度和物品流行度

(2) 用户活跃度和物品流行度的关系

一般认为,新用户倾向于浏览热门的物品,因为他 们对网站还不熟悉,只能点击首页的热门物品,而老用户会逐渐开始浏览冷门的物品。如果用横坐标表示用户活跃度,纵坐标表示具有某个活跃度的所有用户评过分的物品的平均流行度。图中曲线呈明显下 降的趋势,这表明用户越活跃,越倾向于浏览冷门的物品。

仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。学术界对协同过滤算法进行了深入研究,提出了很多方法,比如基于邻域的方法(neighborhood-based)、隐语义模型 (latent factor model)、基于图的随机游走算法(random walk on graph)等。在这些方法中, 最著名的、在业界得到最广泛应用的算法是基于邻域的方法,而基于邻域的方法主要包含下面两种算法。

基于用户的协同过滤算法 :这种算法给用户推荐和他兴趣相似的其他用户喜欢的物品

基于物品的协同过滤算法: 这种算法给用户推荐和他之前喜欢的物品相似的物品

基于邻域的算法是推荐系统中最基本的算法,该算法不仅在学术界得到了深入研究,而且在 业界得到了广泛应用。基于邻域的算法分为两大类,一类是基于用户的协同过滤算法,另一类是 基于物品的协同过滤算法。现在我们所说的协同过滤,基本上就就是指基于用户或者是基于物品的协同过滤算法,因此,我们可以说基于邻域的算法即是我们常说的协同过滤算法

(1) 基于用户的协同过滤算法(UserCF)

基于用户的协同过滤算法的基本思想是:在一个在线个性化推荐系统中,当一个用户A需要个性化推荐 时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。

Ø 从上面的描述中可以看到,基于用户的协同过滤算法主要包括两个步骤。 第一步:找到和目标用户兴趣相似的用户集合。 第二步: 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。

这里,步骤1的关键是计算两个用户的兴趣相似度,协同过滤算法主要利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v) 为用户v曾经有过正反馈的物品集合。那么我们可以通过以下方法计算用户的相似度:

基于余弦相似度

(2) 基于物品的协同过滤算法(itemCF)
与UserCF同理
(3) UserCF和itemCF的比

首先我们提出一个问题,为什么新闻网站一般使用UserCF,而图书、电商网站一般使用ItemCF呢? 首先回顾一下UserCF算法和ItemCF算法的推荐原理。UserCF给用户推荐那些和他有共同兴 趣爱好的用户喜欢的物品,而ItemCF给用户推荐那些和他之前喜欢的物品类似的物品。从这个算 法的原理可以看到,UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF 的推荐结果着重于维系用户的历史兴趣。换句话说,UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。 在新闻网站中,用户的兴趣不是特别细化,绝大多数用户都喜欢看热门的新闻。个性化新闻推荐更加强调抓住 新闻热点,热门程度和时效性是个性化新闻推荐的重点,而个性化相对于这两点略显次要。因 此,UserCF可以给用户推荐和他有相似爱好的一群其他用户今天都在看的新闻,这样在抓住热 点和时效性的同时,保证了一定程度的个性化。同时,在新闻网站中,物品的更新速度远远快于新用户的加入速度,而且 对于新用户,完全可以给他推荐最热门的新闻,因此UserCF显然是利大于弊。

但是,在图书、电子商务和电影网站,比如亚马逊、豆瓣、Netflix中,ItemCF则能极大地发 挥优势。首先,在这些网站中,用户的兴趣是比较固定和持久的。一个技术人员可能都是在购买 技术方面的书,而且他们对书的热门程度并不是那么敏感,事实上越是资深的技术人员,他们看 的书就越可能不热门。此外,这些系统中的用户大都不太需要流行度来辅助他们判断一个物品的 好坏,而是可以通过自己熟悉领域的知识自己判断物品的质量。因此,这些网站中个性化推荐的 任务是帮助用户发现和他研究领域相关的物品。因此,ItemCF算法成为了这些网站的首选算法。 此外,这些网站的物品更新速度不会特别快,一天一次更新物品相似度矩阵对它们来说不会造成 太大的损失,是可以接受的。同时,从技术上考虑,UserCF需要维护一个用户相似度的矩阵,而ItemCF需要维护一个物品 相似度矩阵。从存储的角度说,如果用户很多,那么维护用户兴趣相似度矩阵需要很大的空间, 同理,如果物品很多,那么维护物品相似度矩阵代价较大

下表是对二者的一个全面的表较:

⑹ 协同过滤,矩阵分解有感

    这个概念经常在机器学习的文章中看到,但由于接触不久,所以一直都是一知半解,没有好好了解过。

    首先从字面上理解,“协同”需要一个“集体“,“过滤”就应该是晒选的意思,那么协同过滤总的来说就是通过“集体”来“筛选”,以评分推荐系统为例子,这里的“协同”我个人理解就是集合”众多人的评价”,这里的“评价”,就是“对集体都接触过的事物进行打分”,这样大概就能通过一些共同的事物反应出用户不同的”价值观“,然后通过这样的价值观来”筛选“出价值观高度相似的人,再相互推荐共同都喜爱的东西。那么这样的推荐就很有可能是大家都需要的。

    经过资料洗礼过后,得知cf现在的两大方向,一种是以记忆为基础(Memory-base),另一种是基于模型(Model-based Collaborative Filtering)。

    普及的比较多的前者,它基于关注的目标,又分为基于用户的协同过滤和基于项目的协同过滤,上面举的一个简单的评分推荐系统的例子就可以说是基于用户的协同过滤,它是通过用户对共同物品的“主观价值”来筛选相似用户,再互补评分高的商品,从而达到推荐商品的目的;那么基于项目的意思就是通过这个用户集体对商品集的评价,在物品的角度上去寻找相似度高的物品,达到推荐商品的效果。虽然针对的目标不通,但以我个人理解,大体上都是依赖这个用户集营造的“价值观”,只不过区别在于,基于用户的CF是“关心”各个用户的“主观价值”上的“区别”,而基于项目的CF则是要基于这整个用户集对项目集的“普世价值观”,来甄别出“物品”上的差异。不知道这么比喻恰不恰当哈,“普世”我这边理解就是“大多数”,是一种整体趋势的意思。价值观比较“抽象”的话,再直接点这里的“价值观”就相当于物理中的“参考系”。

    但是以上两种方法在面对,不是每个用户对大多数商品都做出过评价(数据稀疏)时就无能为力,所以基于这个问题就引导出了基于模型(Model-based )的CF,我在最近的论文中接触到的就是一个“矩阵分解”的协同过滤,它能够基于现有的数据得到一个模型,再用此模型进行推荐。那么是如何做到的呢?接下来看看矩阵分解。

    假设我先在有一个关于用户对音乐评分的矩阵如下图:

    只有上述的数据是很难使用户相互推荐音乐的,因为可以看出用户本身听过的歌就不够多,那么如何使数据更加“饱满”呢?这时正是需要矩阵分解的时候,矩阵分解算法的数学理论基础是矩阵的行列变换。行列变换中又有以下规则,我们知道矩阵A进行行变换相当于A左乘一个矩阵,矩阵A进行列变换等价于矩阵A右乘一个矩阵,因此矩阵A可以表示为A=PEQ=PQ(E是标准阵)。

    形象的表示如下图:

    矩阵分解的目的就是把一个稀疏的用户评分矩阵分解成用户因子矩阵和项目因子矩阵相乘的形式R=U(转置)*I,我们的目的就是最后再让两个因子矩阵反乘回去得到饱满的用户评分矩阵。那么这个用户,项目因子是个什么东西呢?我们接着上面的音乐评分的形式说,一首歌可能包含多种音乐风格,我们可以量化风格,体现各种风格在一首歌中的比重,那么这里的“潜在因子”我们就可以当作“音乐风格”,K个因子就可以看作K种风格。譬如下图:

    可以说,这些因子就是我们的模型中的重要参数,个人理解分解出来的这两个因子矩阵就可以说是基于模型的CF中的,“模型”的了,其实我觉得可以类比线性模型中的参数,我们的回归模型最终重要的不就是公式中的各项参数吗,这两个因子矩阵其实就是我们这个模型中的重要参数,参数知道了模型也就求出来了。如果不了解线性模型可以参考吴恩达大大的机器学习课程,里面介绍的很详细,不像我这边一知半哈。

    那么这些个值具体是怎么得出来的呢?过程和求线性回归也很像,接下来就是相关的简单推倒,首先,我们假设,真实的用户评分和我们预测评分的差遵循高斯分布

R用是评分矩阵   U是用户因子矩阵,V是项目因子矩阵

接下来就是极大似然估计,使,在现有数据下概率最大化

    类比求线性模型,就能够了解思想很相似,所以应该同样是运用了似然估计的思想,要使值最大,式子两边同时取对数,可以看到,如果要使概率最大,那么公式的第一项就要最小,是不是想到了什么,没错接下来就可以看到最小二乘法的式子。

    线性模型我们遇到这个情况一般怎么做,没错,就是梯度下降。首先求偏导数

最后就是梯度下降的矩阵因子更新公式:

    接下来迭代到自己设置的阈值收敛就能得到局部最优解了。

    下面是我根据上述矩阵分解的思想随机的模拟实践,可以自行感受一下准度,可能写搓了点~

注释:以上诸多图片材料来自网上多篇博客文章

https://www.hu.com/question/26743347

http://blog.csdn.net/dream_angel_z/article/details/46288167

还有方便实用sklearn的中文API文档

http://cwiki.apachecn.org/pages/viewpage.action?pageId=10030193

⑺ 利用 SVD 实现协同过滤推荐算法

奇异值分解(Singular Value Decomposition,以下简称SVD)
是在机器学习领域广泛应用的算法,它不光可以用于 降维算法中的特征分解 ,还可以用于 推荐系统 ,以及自然语言处理等领域。

优点: 简化数据,去除噪声,提高算法的结果。
缺点: 数据的转换可能难以理解。

应用领域: 推荐引擎(协同过滤、相似度计算)、图像压缩等。

SVD定义: 如果我们求出了矩阵A的n个特征值λ1≤λ2≤...≤λn,以及这n个特征值所对应的特征向量{w1,w2,...wn},如果这n个特征向量线性无关,那么矩阵A就可以用下式的特征分解表示:A=WΣW−1,其中W是这n个特征向量所张成的n×n维矩阵,而Σ为这n个特征值为主对角线的n×n维矩阵。一般我们会把W的这n个特征向量标准化,即满足||wi||2=1, 或者wiTwi=1,此时W的n个特征向量为标准正交基,满WTW=I,即WT=W−1, 也就是说W为酉矩阵。要进行特征分解,矩阵A必须为方阵。那么如果A不是方阵,则用到SVD。

矩阵A的SVD为:A=UΣVT,其中U是一个m×m的矩阵,Σ是一个m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,V是一个n×n的矩阵。U和V都是酉矩阵,即满足UTU=I,VTV=I。

对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。

因此SVD 也是一种强大的降维工具 ,可以利用 SVD 来逼近矩阵并从中获得主要的特征。通过保留矩阵的 80%~90% 的能量,就可以得到重用的特征并去除噪声。

推荐系统 是利用电子商务网站向客户提供商品信息和建议,帮助用户决定应该购买什么产品,模拟销售人员帮助客户完成购买过程。
主要有以下几种推荐算法:
基于内容的推荐(用到自然语言处理), 协同过滤(主流) ,基于规则推荐(基于最多用户点击,最多用户浏览等),混合推荐(类似集成算法,投票决定),基于人口统计信息的推荐(根据用户基本信息)

协同过滤推荐分为三种类型。 第一种是基于用户(user-based)的协同过滤(需要在线找用户和用户之间的相似度关系),第二种是基于项目(item-based)的协同过滤(基于项目的协同过滤可以离线找物品和物品之间的相似度关系), 第三种是基于模型(model based)的协同过滤(用户和物品,主流)。

一般在推荐系统中,数据往往是使用 用户-物品 矩阵来表示的。 用户对其接触过的物品进行评分,评分表示了用户对于物品的喜爱程度,分数越高,表示用户越喜欢这个物品。而这个矩阵往往是稀疏的,空白项是用户还未接触到的物品,推荐系统的任务则是选择其中的部分物品推荐给用户。

对于这个 用户-物品 矩阵,用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。

具体基于模型的方法有:
用关联算法做协同过滤(Apriori算法、FP Tree算法)
用聚类算法做协同过滤(针对基于用户或者基于模型,Kmeans,DBSCAN)
用分类算法做协同过滤(设定评分阈值,高于推荐,低于不推荐,逻辑回归和朴素贝叶斯,解释性很强)
用回归算法做协同过滤(Ridge回归,回归树)
用矩阵分解做协同过滤(由于传统的奇异值分解SVD要求矩阵不能有缺失数据,必须是稠密的,而用户物品评分矩阵是一个典型的稀疏矩阵,主要是SVD的一些变种,比如FunkSVD,BiasSVD和SVD++。这些算法和传统SVD的最大区别是不再要求将矩阵分解为UΣVT的形式,而变是两个低秩矩阵PTQ的乘积形式。)
用神经网络做协同过滤(限制玻尔兹曼机RBM)

在 Python 的 numpy 中,linalg已经实现了SVD

⑻ 协同过滤

协同过滤(Collaborative Filtering,CF)——经典/老牌
只用户行为数据得到。对于 个用户, 个物品,则有共现矩阵 :
对于有正负反馈的情况,如“赞”是1和“踩”是-1,无操作是0:

对于只有显示反馈,如点击是1,无操作是0:

算法步骤:
1)得到共现矩阵 ;
2)计算 任意两行 用户相似度,得到用户相似度矩阵 ;
3)针对某个用户 选出与其最相似的 个用户, 是超参数;——召回阶段
4)基于这 个用户,计算 对每个物品的得分;
5)按照用户 的物品得分进行排序,过滤已推荐的物品,推荐剩下得分最高的 个。——排序阶段

第2步中,怎么计算用户相似度?——使用共现矩阵的行
以余弦相似度为标准,计算 和 之间的相似度:


第4步中,怎么每个用户对每个物品的得分?
假如和用户 最相似的2个为 和 :


对物品 的评分为1,用户 对物品 的评分也为1,那么用户 对 的评分为:

也就是说:利用用户相似度对用户评分进行加权平均:

其中, 为用户 和用户 之间的相似度, 为用户 和物品 之间的相似度。

UserCF的缺点
1、现实中用户数远远大于物品数,所以维护用户相似度矩阵代价很大;
2、共现矩阵是很稀疏的,那么计算计算用户相似度的准确度很低。

算法步骤:
1)得到共现矩阵 ;
2)计算 任意两列 物品相似度,得到物品相似度矩阵 ;
3)对于有正负反馈的,获得用户 正反馈的物品;
4)找出用户 正反馈的物品最相似的 个物品,组成相似物品集合;——召回阶段
5)利用相似度分值对相似物品集合进行排序,生产推荐列表。——排序阶段
最简单情况下一个物品(用户未接触的)只出现在另一个物品(用户已反馈的)的最相似集合中,那么每个用户对每个物品的得分就是相似度。如果一个物品和多个物品最相似怎么办?
如用户正反馈的是 和 ,对于物品 其最相似的是 ,相似度为0.7,对于物品 其最相似的也是 ,相似度为0.6,那么 相似度为:

也就是说:如果一个物品出现在多个物品的 个最相似的物品集合中,那么该物品的相似度为多个相似度乘以对应评分的累加。

其中, 是物品p与物品h的相似度, 是用户u对物品p的评分。

第2步中,怎么计算物品相似度?——使用共现矩阵的列
以余弦相似度为标准,计算 和 之间的相似度:


余弦相似度
皮尔逊相关系数
基于皮尔逊相关系数的改进

UserCF适用于用户兴趣比较分散变换较快的场景,如新闻推荐。
IteamCF适用于用户情趣不叫稳定的场景,如电商推荐。

优点:直观,可解释性强。
缺点:

⑼ 推荐系统(一):基于物品的协同过滤算法

协同过滤(collaborative filtering)算法是最经典、最常用的推荐算法。其基本思想是收集用户偏好,找到相似的用户或物品,然后计算并推荐。
基于物品的协同过滤算法的核心思想就是:给用户推荐那些和他们之前喜欢的物品相似的物品。主要可分为两步:
(1) 计算物品之间的相似度,建立相似度矩阵。
(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。

相似度的定义有多种方式,下面简要介绍其中几种:

其中,分母 是喜欢物品 的用户数,而分子 是同时喜欢物品 和物品 的用户数。因此,上述公式可以理解为喜欢物品 的用户中有多少比例的用户也喜欢物品 。
上述公式存在一个问题。如果物品 很热门, 就会很大,接近1。因此,该公式会造成任何物品都会和热门的物品有很大的相似度,为了避免推荐出热门的物品,可以用下面的公式:

这个公式惩罚了物品 的权重,因此减轻了热门物品会和很多物品相似的可能性。
另外为减小活跃用户对结果的影响,考虑IUF(nverse User Frequence) ,即用户活跃度对数的倒数的参数,认为活跃用户对物品相似度的贡献应该小于不活跃的用户。

为便于计算,还需要进一步将相似度矩阵归一化 。

其中 表示用户 对物品 的评分。 在区间 内,越接近1表示相似度越高。

表示空间中的两个点,则其欧几里得距离为:

当 时,即为平面上两个点的距离,当表示相似度时,可采用下式转换:

距离越小,相似度越大。

一般表示两个定距变量间联系的紧密程度,取值范围为[-1,1]

其中 是 和 的样品标准差

将用户行为数据按照均匀分布随机划分为M份,挑选一份作为测试集,将剩下的M-1份作为训练集。为防止评测指标不是过拟合的结果,共进行M次实验,每次都使用不同的测试集。然后将M次实验测出的评测指标的平均值作为最终的评测指标。

对用户u推荐N个物品(记为 ),令用户u在测试集上喜欢的物品集合为 ,召回率描述有多少比例的用户-物品评分记录包含在最终的推荐列表中。

准确率描述最终的推荐列表中有多少比例是发生过的用户-物品评分记录。

覆盖率反映了推荐算法发掘长尾的能力,覆盖率越高,说明推荐算法越能够将长尾中的物品推荐给用户。分子部分表示实验中所有被推荐给用户的物品数目(集合去重),分母表示数据集中所有物品的数目。

采用GroupLens提供的MovieLens数据集, http://www.grouplens.org/node/73 。本章使用中等大小的数据集,包含6000多用户对4000多部电影的100万条评分。该数据集是一个评分数据集,用户可以给电影评1-5分5个不同的等级。本文着重研究隐反馈数据集中TopN推荐问题,因此忽略了数据集中的评分记录。

该部分定义了所需要的主要变量,集合采用字典形式的数据结构。

读取原始CSV文件,并划分训练集和测试集,训练集占比87.5%,同时建立训练集和测试集的用户字典,记录每个用户对电影评分的字典。

第一步循环读取每个用户及其看过的电影,并统计每部电影被看过的次数,以及电影总数;第二步计算矩阵C,C[i][j]表示同时喜欢电影i和j的用户数,并考虑对活跃用户的惩罚;第三步根据式\ref{similarity}计算电影间的相似性;第四步进行归一化处理。

针对目标用户U,找到K部相似的电影,并推荐其N部电影,如果用户已经看过该电影则不推荐。

产生推荐并通过准确率、召回率和覆盖率进行评估。

结果如下所示,由于数据量较大,相似度矩阵为 维,计算速度较慢,耐心等待即可。

[1]. https://blog.csdn.net/m0_37917271/article/details/82656158
[2]. 推荐系统与深度学习. 黄昕等. 清华大学出版社. 2019.
[3]. 推荐系统算法实践. 黄美灵. 电子工业出版社. 2019.
[4]. 推荐系统算法. 项亮. 人民邮电出版社. 2012.
[5]. 美团机器学习实践. 美团算法团队. 人民邮电出版社. 2018.

⑽ 矩阵分解算法

矩阵分解算法主要用于解决协同过滤算法泛化能力弱的问题。

在现实中人和商品可以进行分类,比如将人分为偏好刺激的、偏好自然的,将电影分为恐怖的、温馨的。当我们以这样信息对人和物进行标定后就可以根据他们直接的距离来判断他们的相似程度。

一般协同过滤的思路通过物品找到相似的人,在给用户1推荐和他相似的用户喜欢的物品。

对用户和物品在映射到低维度下计算他们之间的距离。

原有的 大小的共现矩阵 ,我们的目标是将它分解为 , 表示降维后的用户矩阵, 表示降维后的物品矩阵, 表示降温的程度一般 是远小于 。

如何进行矩阵分解?接下来介绍几种策略

在推荐模型中出现矩阵分解思路时自然想到了SVD(奇异值分解),SVD可以将一个矩阵 分解为 的形式,D中主对角线上是从到到小排序的奇异值,我们选择前几个奇异值和对应U和V的向量这样实现了降维。

降维后的 可以作为用户矩阵,降维后的 可以作为物品矩阵。接着使用 , 公式对所有的用户产品组合进行评分,这样我们就把原共现矩阵中用户没有评分的物品也打上分了,利用这些评分就可以完成推荐。

问题就这样完美解决了?并不是。

矩阵 要进行SVD分解它就不能存在空的数据,而我们待分解的矩阵由于用户操作的低频特点,肯定会有空的位置出现,并且如果已经有了一个填满数据的共现矩阵,那就不用进行分解直接用就可以了。针对空数据可以采用填0、填平均值等方式暴力补全数据,但是这样的操作会影响准确度而且对越稀疏的矩阵影响越大,同时存放一个暴力填满的矩阵要求更多的存储空间,还有SVD的时间复杂度 也很可观。

这个模型感觉和SVD关系不大了,他的目标是得到矩阵 和 ,这两个矩阵可以很好的反应已知的用户数据,根据以上目标构造待优化的目标函数

这里 表示用户评分样本集合。为了避免过拟合引入正则项后目标函数变为

接着利用梯度下降求解 和 。

Funk-SVD模式解决了SVD模型中空数据需要保留填写、SVD分解耗时、占用空间多的问题。同时考虑一些偏置。

用户偏置 :一些用户喜欢打高分、一些用户喜欢打低分

物品偏置 :一些电影普遍得分高

整体偏置 :数据整体的平均得分

这样可以消除偏置,让预测更合理。

该模型依然存在利用信息有限的缺点。

深度学习推荐系统 王喆

推荐系统之矩阵分解家族

推荐系统实践 项亮

阅读全文

与协同过滤共现矩阵相关的资料

热点内容
液相用溶剂过滤器 浏览:674
纳滤水导电率 浏览:128
反渗透每小时2吨 浏览:162
做一个纯净水工厂需要多少钱 浏览:381
最终幻想4回忆技能有什么用 浏览:487
污水提升器采通 浏览:397
反渗透和不发渗透净水器有什么区别 浏览:757
提升泵的扬程 浏览:294
泽德提升泵合肥经销商 浏览:929
饮水机后盖漏水了怎么办 浏览:953
小型电动提升器 浏览:246
半透膜和细胞膜区别 浏览:187
废水拖把池 浏览:859
十四五期间城镇污水处理如何提质增效 浏览:915
怎么测试空气净化器的好坏 浏览:519
提升泵是干嘛的 浏览:744
布油做蒸馏起沫咋办 浏览:252
广州工业油烟净化器一般多少钱 浏览:204
喜哆哆空气净化器效果怎么样 浏览:424
油烟净化器油盒在什么位置 浏览:582