• 回答数

    3

  • 浏览数

    238

达达1110
首页 > 期刊论文 > 深度矩阵分解算法软件学报

3个回答 默认排序
  • 默认排序
  • 按时间排序

沧桑小脸

已采纳

矩阵分解funkSVD:该矩阵分解不像是线代中的,他属于伪分解。其主要思想是,用两个m*k和k*n的矩阵代替m*n的矩阵。因为在推荐系统中,矩阵十分稀疏,分解后的矩阵一般是密集的,且可以通过行列相乘来得到空缺的值。(其预测的是第u个用户对第i个商品的评分)其通过机器学习最小化损失函数来得到矩阵, 其学习方式有两种,一种是随机梯度下降,一种是交替最小二乘。 第一种不说,随处可见。第二种是通过 该式子实现的。 我们先随机化一个Q,因为R是那个稀疏矩阵已知,所以能得到P,我们再反过来用PR求Q。直到模型的误差低于一个阈值。 上面的svd是对于评分的算法,还有svd++等对用户,物品做了偏移项。隐式矩阵分解(最常见)ALS 我们一般的推荐问题不是通过评分推荐,因为评分的产生十分的困难,一般用户没有这个习惯。我们与其预测评分,不如去预测用户行为。如果我们给用户一个页面有十个商品,我们预测到用户会点击哪一个,这不就说明用户喜欢这个。而且基于用户的信息很多。 我们的矩阵由1,0和空缺组成,1表示该用户点击过该商品(即表示用户对它有想法),0表示用户对它没有想法(怎么是没想法呢,我们定义用户知道他却不想了解他。即我们在所有没有点击该商品的用户中抽样,该商品越火热抽取的人越多。因为热门的东西大家应该都知道,而你却没点击他,说明他不感兴趣) 我们要将该矩阵分解。 我们的损失函数是 Cui是置信度,比如我点击10次当时比只点击一次的喜欢置信度高。对于学习方法,我们使用加权交替最小二乘法初始化Y,我们计算出x,再通过 计算出y。再反复交替,直到小于阈值。该算法目前在spark上有实现。且sparkml将其作为唯一的推荐系统算法。

252 评论

白小白爱吐槽

整理一下自己的理解。对于一个users-products-rating的评分数据集,ALS会建立一个user*product的m*n的矩阵其中,m为users的数量,n为products的数量但是在这个数据集中,并不是每个用户都对每个产品进行过评分,所以这个矩阵往往是稀疏的,用户i对产品j的评分往往是空的ALS所做的事情就是将这个稀疏矩阵通过一定的规律填满,这样就可以从矩阵中得到任意一个user对任意一个product的评分,ALS填充的评分项也称为用户i对产品j的预测得分所以说,ALS算法的核心就是通过什么样子的规律来填满(预测)这个稀疏矩阵它是这么做的:假设m*n的评分矩阵R,可以被近似分解成U*(V)TU为m*d的用户特征向量矩阵V为n*d的产品特征向量矩阵((V)T代表V的转置,原谅我不会打转置这个符号。。)d为user/product的特征值的数量关于d这个值的理解,大概可以是这样的对于每个产品,可以从d个角度进行评价,以电影为例,可以从主演,导演,特效,剧情4个角度来评价一部电影,那么d就等于4可以认为,每部电影在这4个角度上都有一个固定的基准评分值例如《末日崩塌》这部电影是一个产品,它的特征向量是由d个特征值组成的d=4,有4个特征值,分别是主演,导演,特效,剧情每个特征值的基准评分值分别为(满分为):主演:(大光头还是那么霸气)导演:特效:剧情:矩阵V由n个product*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算法的核心就是将稀疏评分矩阵分解为用户特征向量矩阵和产品特征向量矩阵的乘积交替使用最小二乘法逐步计算用户/产品特征向量,使得差平方和最小通过用户/产品特征向量的矩阵来预测某个用户对某个产品的评分不知道是不是理解正确了有几个问题想请教一下~

146 评论

雪莉小姐的

------------------------------------------------------------------------------------------------------------------------------------------------

对于推荐系统来说存在两大场景即评分预测(rating prediction)与Top-N推荐(item recommendation,item ranking)。矩阵分解主要应用于评分预测场景。

推荐系统的评分预测场景可看做是一个矩阵补全的游戏,矩阵补全是推荐系统的任务,矩阵分解是其达到目的的手段。因此,矩阵分解是为了更好的完成矩阵补全任务(欲其补全,先其分解之)。之所以可以利用矩阵分解来完成矩阵补全的操作,那是因为基于这样的假设:假设UI矩阵是低秩的,即在大千世界中,总会存在相似的人或物,即物以类聚,人以群分,然后我们可以利用两个小矩阵相乘来还原它。

矩阵分解就是把原来的大矩阵,近似的分解成小矩阵的乘积,在实际推荐计算时不再使用大矩阵,而是使用分解得到的两个小矩阵。

具体来说就是,假设用户物品的评分矩阵A是m乘n维,即一共有m个用户,n个物品.通过一套算法转化为两个矩阵U和V,矩阵U的维度是m乘k,矩阵V的维度是n乘k。

这两个矩阵的要求就是通过下面这个公式可以复原矩阵A:

说起矩阵分解,我们第一个想起的就是SVD。

SVD分解的形式为3个矩阵相乘,左右两个矩阵分别表示用户/项目隐含因子矩阵,中间矩阵为奇异值矩阵并且是对角矩阵,每个元素满足非负性,并且逐渐减小。因此我们可以只需要前个K因子来表示它。

但SVD分解要求矩阵是稠密的,也就是说矩阵的所有位置不能有空白。有空白时我们的M是没法直接去SVD分解的。大家会说,如果这个矩阵是稠密的,那不就是说我们都已经找到所有用户物品的评分了嘛,那还要SVD干嘛! 的确,这是一个问题,传统SVD采用的方法是对评分矩阵中的缺失值进行简单的补全,比如用全局平均值或者用用户物品平均值补全,得到补全后的矩阵。接着可以用SVD分解并降维。

虽然有了上面的补全策略,我们的传统SVD在推荐算法上还是较难使用。因为我们的用户数和物品一般都是超级大,随便就成千上万了。这么大一个矩阵做SVD分解是非常耗时的。那么有没有简化版的矩阵分解可以用呢?我们下面来看看实际可以用于推荐系统的矩阵分解。

FunkSVD是在传统SVD面临计算效率问题时提出来的,既然将一个矩阵做SVD分解成3个矩阵很耗时,同时还面临稀疏的问题,那么我们能不能避开稀疏问题,同时只分解成两个矩阵呢?也就是说,现在期望我们的矩阵M这样进行分解:

SVD分解已经很成熟了,但是FunkSVD如何将矩阵M分解为P和Q呢?这里采用了线性回归的思想。目标是让用户的评分和用矩阵乘积得到的评分残差尽可能的小,也就是说,可以用均方差作为损失函数,来寻找最终的P和Q。

在实际应用中,为了防止过拟合,会加入一个L2的正则化项。加入了正则化系数,需要调参。对于这个优化问题,一般通过梯度下降法来进行优化得到结果。

在FunkSVD算法火爆之后,出现了很多FunkSVD的改进版算法。其中BiasSVD算是改进的比较成功的一种算法。BiasSVD假设评分系统包括三部分的偏置因素:一些和用户物品无关的评分因素,用户有一些和物品无关的评分因素,称为用户偏置项。而物品也有一些和用户无关的评分因素,称为物品偏置项。这其实很好理解。比如一个垃圾山寨货评分不可能高,自带这种烂属性的物品由于这个因素会直接导致用户评分低,与用户无关。

一个用户给一个物品的评分会由四部分相加:

从左到右分别代表:全局平均分、物品的评分偏置、用户的评分偏置、用户和物品之间的兴趣偏好

BiasSVD增加了一些额外因素的考虑,因此在某些场景会比FunkSVD表现好。

SVD++算法在BiasSVD算法上进一步做了增强,这里它增加考虑用户的隐式反馈。它是基于这样的假设:用户除了对于项目的显式历史评分记录外,浏览记录或者收藏列表等隐反馈信息同样可以从侧面一定程度上反映用户的偏好,比如用户对某个项目进行了收藏,可以从侧面反映他对于这个项目感兴趣,具体反映到预测公式为:

学习算法依然不变,只是要学习的参数多了两个向量:x和y。一个是隐式反馈的物品向量,另一个是用户属性的向量,这样在用户没有评分时,也可以用他的隐式反馈和属性做出一定的预测。

它是基于这样的假设:用户的兴趣或者偏好不是一成不变的,而是随着时间而动态演化。于是提出了timeSVD,其中用户的和物品的偏置随着时间而变化,同时用户的隐含因子也随着时间而动态改变,在此物品的隐含表示并未随时间而变化(假设物品的属性不会随着时间而改变)。

其中,t为时间因子,表示不同的时间状态。

通过之前构建目标函数之后,就要用到优化算法找到能使它最小的参数。优化方法常用的选择有两个,一个是随机梯度下降(SGD),另一个是交替最小二乘(ALS),在实际应用中,交替最小二乘更常用一些,这也是推荐系统中选择的主要矩阵分解方法。 找到两个矩阵P和Q,让它们相乘后约等于原矩阵R:

P和Q两个都是未知的,如果知道其中一个的话,就可以按照代数标准解法求得,比如知道Q,那么P就可以这样算:

也就是R矩阵乘Q矩阵的逆矩阵就得到了结果,反之,知道了P 再求Q 也一样,交替最小二乘通过迭代的方式解决这个鸡生蛋蛋生鸡的难题: 1)、初始化随机矩阵Q里面的元素值

2)、把Q矩阵当做已知的,直接用线性代数的方法求得矩阵P

3)、得到了矩阵P后,把P当做已知的,故技重施,回去求解矩阵Q

4)、 上面两个过程交替进行,一直到误差可以接受为止

使用交替最小二乘好处: 1.在交替的其中一步,也就是假设已知其中一个矩阵求解另一个时,要优化的参数是很容易并行的; 2.在不是很稀疏的数据集合上,交替最小二乘通常比随机梯度下降要更快的得到结果。

在很多推荐场景中,我们都是基于现有的用户和商品之间的一些数据,得到用户对所有商品的评分,选择高分的商品推荐给用户,这是funkSVD之类算法的做法,使用起来也很有效。但是在有些推荐场景中,我们是为了在千万级别的商品中推荐个位数的商品给用户,此时,我们更关心的是用户来说,哪些极少数商品在用户心中有更高的优先级,也就是排序更靠前。也就是说,我们需要一个排序算法,这个算法可以把每个用户对应的所有商品按喜好排序。BPR就是这样的一个我们需要的排序算法。

BPR根据像交替最小二乘那样完成矩阵分解,先假装矩阵分解结果已经有了,于是就计算出用户对于每个物品的推荐分数,只不过这个推荐分数可能并不满足均方根误差最小,而是满足物品相对排序最佳

得到了用户和物品的推荐分数后,就可以计算四元组的样本中,物品1和物品2的分数差,这个分数可能是正数,也可能是负数,也可能是0。如果物品1和物品2相对顺序为1,那么希望两者分数之差是个正数,而且越大越好;如果物品1和物品2的相对顺序是0,则希望分数之差是负数,且越小越好。 目标函数:

把这个目标函数化简和变形后,和把AUC当成目标函数是非常相似的,也正是因为如此,BPR模型宣称该模型是为AUC而生的。

SVDFeature 是由上海交大Apex Data & Knowledge Management Lab(APEX)开发的一个推荐系统工具包。他们提出了一种基于feature 的矩阵分解的框架。

它的目的是有效地解决基于特征的矩阵分解。新的模型可以只通过定义新的特征来实现。

这种基于特征的设置允许我们把很多信息包含在模型中,使得模型更加与时俱进。使用此工具包,可以很容易的把其他信息整合进模型,比如时间动态,领域关系和分层信息。除了评分预测,还可以实现pairwise ranking任务。

SVDFeature的模型定义如下:

输入包含三种特征<α,β,γ>,分别是用户特征,物品特征和全局特征。

SVD :要求矩阵是稠密的,时间复杂度高。不推荐使用。 FunkSVD :不在将矩阵分解为3个矩阵,而是分解为2个低秩的用户项目矩阵,同时降低了时间复杂度。 BiasSVD :考虑偏置项时使用,也就是用户的爱好。 SVD++ :考虑用户的隐式反馈时使用。主动点评电影或者美食的用户是少数,也就是说显示反馈比隐式反馈少,这个时候就可以根据用户的隐式反馈推荐。 timeSVD :考虑时间因素时使用。人是善变的,随着时间的流逝,兴趣也会发生变化。 ALS :考虑建模时间时使用。强烈推荐使用,这也是社交巨头 Facebook 在他们的推荐系统中选择的主要矩阵分解算法。 BPR :考虑排序结果时使用。 SVDFeature :当我们有多个特征时,可以使用。SVDFeature的目的就是解决基于特征的矩阵分解。

矩阵分解算法的缺点 :都没有解决冷启动问题

准确率表示预测正确的样本数占总样本数的比例。

TP(true positive):表示样本的真实类别为正,最后预测得到的结果也为正; FP(false positive):表示样本的真实类别为负,最后预测得到的结果却为正; FN(false negative):表示样本的真实类别为正,最后预测得到的结果却为负; TN(true negative):表示样本的真实类别为负,最后预测得到的结果也为负.

精确率表示预测为正样本的样本中,正确预测为正样本的概率。

召回率表示正确预测出正样本占实际正样本的概率。

折中了召回率与精确率。

对于评分预测任务,一般都是根据原有的评分数据,利用矩阵分解等方法去拟合原评分,使得优化后的模型可以去预测新的评分,这里就要衡量你预测的评分和实际评分的差异了,指标也很简单,分为RMSE和MSE。 MSE 是指参数估计值与参数真值之差平方的期望值; MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。 RMSE :RMSE是MSE的算术平方根。

AUC 这个值在数学上等价于:模型把关心的那一类样本排在其他样本前面的概率。最大是 1,完美结果,而 就是随机排列,0 就是完美地全部排错。 这个非常适合用来评价模型的排序效果,很适合作为BPR的评价指标。得到一个推荐模型后,按照它计算的分数,可以把用户想要的物品排在最前面。

具体的计算过程可看我的另一篇 文章

其中Rel表示与用户 u 相关的商品集(测试集), Rec表示推荐给用户的前K个列表,二者的交集除以Rec的集合元素个数(其实就是K),得到Precision@K。一般是算出每个用户的Precision@K,然后取平均值。

其中Rel表示与用户u相关的商品集(测试集),Rec表示推荐给用户的前K个列表,二者的交集除以Rec的集合元素个数(也就是测试集中用户u评过分的商品数),得到Recall@K。一般是算出每个用户的Recall@K,然后取平均值。

MAP(Mean Average Precision):单个主题的平均准确率是每篇相关文档检索出后的准确率的平均值。

主集合的平均准确率(MAP)是每个主题的平均准确率的平均值。

MAP 是反映系统在全部相关文档上性能的单值指标。

系统检索出来的相关文档越靠前(rank 越高),MAP就可能越高。如果系统没有返回相关文档,则准确率默认为0。 例如:

假设有两个主题,主题1有4个相关网页,主题2有5个相关网页。

某系统对于主题1检索出4个相关网页,其rank分别为1, 2, 4, 7;

对于主题2检索出3个相关网页,其rank分别为1,3,5。

对于主题1,平均准确率为(1/1+2/2+3/4+4/7)/4=。对于主题2,平均准确率为(1/1+2/3+3/5+0+0)/5=。

则MAP= ()/2=。

正确检索结果值在检索结果中的排名来评估检索系统的性能。

其中Q是用户的个数,rank是对于第i个用户,推荐列表中第一个在ground-truth结果中的item所在的排列位置。

举个例子:假如检索三次的结果如下,需要的结果(cat,torus,virus)分别排在3,2,1的话,此系统地MRR为(1/3 + 1/2 + 1)/3 = 11/18

比较复杂,可参考这篇 文章

参考文章:

268 评论

相关问答

  • 矩阵计算的毕业论文

    还有三个月就是毕业生们答辩的时间了,但是很多毕业生们目前连选题都还没有选好。时间紧迫,我立马为大家精心整理了一些大学数学系本科毕业论文题目,供毕业生们参考!

    redfishchy 3人参与回答 2023-12-12
  • 矩阵特征值计算论文开题报告

    你的问题到底是什么呢,是关于特征向量和特征值的吗?

    waterimilan 5人参与回答 2023-12-08
  • 灰度共生矩阵提取毕业论文

    对于每个像素点,把你得到的这些特征串成一个向量,然后把这些向量作为fcm的输入,对每个像素进行分类。如果定义两个类,一个是分割对象目标,另一个是背景,那么分类的

    红月光薇儿 4人参与回答 2023-12-06
  • 分块矩阵的应用论文开题报告

    我们可以对矩阵进行任意划分,叫做 分块 。每个块的大小是任意的没有必要都是方阵 如果是两个分块矩阵相加,只有相同划分的矩阵才能相加与矩阵的数乘一模一样

    转瞬壹刻 3人参与回答 2023-12-08
  • 软件学报难度

    软件学报是很难投的,审稿时间长,难度大,是EI核心来源期刊; 可接受8000-10000字左右的长文; 稿量大,处理流程大多缓慢,应早投; 《投稿方式:直接网站

    奔向八年 8人参与回答 2023-12-09