矩阵分解综述
推荐系统有两种场景,即评分预测和Top-N推荐。矩阵分解主要用于评分预测场景。
推荐系统的评分预测场景可以看作是一个矩阵完备化的游戏,矩阵完备化是推荐系统的任务,矩阵分解是实现其目标的手段。所以矩阵分解是为了更好的完成矩阵补全的任务(要补全就先分解)。之所以可以用矩阵分解来完成矩阵补全的运算,是基于假设UI矩阵是低秩的,也就是在世界上,总会有相似的人或事,也就是物以类聚,然后我们可以把两个小矩阵相乘来还原。
矩阵分解是将原大矩阵近似分解成小矩阵的乘积。在实际的推荐计算中,不再使用大矩阵,而是使用分解得到的两个小矩阵。
具体来说,假设用户商品的评分矩阵A是m乘以n,即a * * *有m个用户,n个商品。通过一套算法转化为两个矩阵U和V,矩阵U的维数是m乘以k,矩阵V的维数是n乘以k..
这两个矩阵的要求是矩阵A可以通过以下公式恢复:
说到矩阵分解,首先想到的就是SVD。
SVD分解的形式是三个矩阵相乘,左右矩阵分别代表用户/物品隐含因子矩阵,中间矩阵是奇异值矩阵和对角矩阵,每个元素满足非负性并逐渐递减。所以我们可以只需要第一个k因子来表示。
但是SVD分解要求矩阵是稠密的,也就是说矩阵的所有位置都不能为空。当有一个空白时,我们的m不能被SVD直接分解。大家会说,如果这个矩阵是稠密的,那不代表我们已经找到了所有用户项的得分,那为什么还要SVD呢?的确,这是个问题。传统的SVD方法是简单地对评分矩阵中的缺失值进行补全,如全局平均值或用户商品的平均值,得到补全矩阵。那么可以用奇异值分解来分解和降维。
尽管有上述的完成策略,我们传统的SVD仍然很难用在推荐算法中。因为我们的用户和物品一般都是超级大的,字面上是几千个。对这么大的矩阵做SVD分解是非常耗时的。那么有没有简化版的矩阵分解可用呢?让我们来看看矩阵分解在推荐系统中的实际应用。
FunkSVD是在传统SVD面临计算效率问题时提出的。既然像SVD一样把一个矩阵分解成三个矩阵很耗时,还面临着稀疏性的问题,那么是否可以避免稀疏性问题,只把它同时分解成两个矩阵呢?也就是说,我们现在期望我们的矩阵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像交替最小二乘法一样完成矩阵分解,先假装矩阵分解结果已经有了,于是计算用户对每个项目的推荐分数,但是这个推荐分数可能不满足最小均方根误差,但是项目的相对排名是最好的。
得到用户和条目的推荐分数后,我们就可以计算出quad样本中条目1和条目2的分数差。这个分数可以是正数,负数,也可以是0。如果第1项和第2项的相对顺序是1,那么希望它们的分数之差是正数,越大越好;如果第1项和第2项的相对顺序为0,则预计分数差为负,越小越好。
目标函数:
将这个目标函数简化变形后,就非常类似于把AUC作为目标函数,也正因为如此,BPR模型才声称这个模型是为AUC而生的。
SVDFeature由apex data & amp;知识管理实验室(APEX)开发的推荐系统工具包。他们提出了基于特征的矩阵分解框架。
其目的是有效地解决基于特征的矩阵分解。新模型只能通过定义新特征来实现。
这种基于特征的设置允许我们在模型中包含大量信息,从而使模型更加及时。使用这个工具包,其他信息可以很容易地集成到模型中,比如时间动态、域关系和层次信息。除了得分预测,还可以实现成对排名任务。
SVDFeature的模型定义如下:
输入包含三个特征
SVD:要求矩阵密集,时间复杂度高。不推荐。
FunkSVD:不是将矩阵分解成三个矩阵,而是分解成两个低秩用户项矩阵,降低了时间复杂度。
BiasSVD:在考虑偏向项,即用户的爱好时使用。
SVD++:在考虑用户的隐式反馈时使用。有少数用户主动评论电影或美食,也就是说,显示性反馈小于隐性反馈。这时候你可以根据用户的隐性反馈进行推荐。
TimeSVD:在考虑时间因素时使用。人是善变的,随着时间的推移,兴趣也会发生变化。
ALS:在考虑建模时间时使用。强烈推荐,这也是社交巨头脸书在他们的推荐系统中选择的主要矩阵分解算法。
BPR:在考虑排序结果时使用。
SVDFeature:当我们有多个特性时,我们可以使用。SVDFeature的目的是解决基于特征的矩阵分解。
矩阵分解算法的缺点:都没有解决冷启动问题。
准确度表示正确预测的样本数与样本总数的比率。
TP(真阳性):表示样本的真实类别为阳性,最终预测结果也为阳性;
FP(假阳性):表示样本的真实类别为阴性,但最终预测结果为阳性;
FN(假阴性):表示样本真实类别为阳性,但最终预测结果为阴性;
TN(真阴性):表示样本的真类别为阴性,最终预测结果也为阴性。
准确率表示在预测为正样本的样本中正确预测正样本的概率。
召回率表示正样本被正确预测以解释实际正样本的概率。
在召回率和准确率上妥协。
对于分数预测任务,一般根据原始分数数据,通过矩阵分解等方法对原始分数进行拟合,使优化后的模型预测新的分数。这里需要衡量你的预测分数和实际分数的差距,指标也很简单,分为RMSE和MSE。
MSE是指参数估计值与参数真实值之差的平方的期望值;
MSE可以评价数据的变化程度,MSE值越小,预测模型对实验数据的描述越准确。
RMSE :RMSE是均方差的算术平方根。
AUC值在数学上等同于模型将相关样本排在其他样本之前的概率。最大值是1,这是完美的结果,而0.5是随机排列,0是完美排列。
这非常适合评价模型的排名效果,非常适合作为BPR的一个评价指标。得到一个推荐模型后,根据它计算出的分数,可以把用户想要的物品排在第一位。
详细的计算过程可以在我的另一篇文章中找到。
其中Rel表示与用户U相关的产品集(测试集),Rec表示推荐给用户的前k个列表。两者的交集除以Rec集合中的元素个数(实际是K),得到Precision@K。一般是计算每个用户的Precision@K,然后取平均值。
其中Rel代表与用户U相关的产品集(测试集),Rec代表推荐给用户的前k个列表。将它们的交集除以Rec集合中的元素个数(即用户U在测试集中过度评价的产品个数),得到Recall@K。一般是计算每个用户的召回@K,然后取平均值。
MAP(Mean Average Precision):单个主题的平均准确率是检索后每个相关文档的平均准确率。
主集的平均准确率(MAP)是每个主题的平均准确率的平均值。
MAP是反映系统在所有相关文档上的性能的单值索引。
系统检索到的相关文档越高(等级越高),映射可能越高。如果系统没有返回相关单据,准确率默认为0。
例如:
假设有两个主题,主题1有4个相关页面,主题2有5个相关页面。
一个系统检索主题为1的四个相关网页,它们的排名分别是1,2,4,7;
对于主题2,检索到三个相关网页,它们的排名分别是1、3和5。
对于题目1,平均准确率为(1/1+2/2+3/4+4/7)/4 = 0.83。对于题目2,平均准确率为(1/1+2/3+3/5+0+0)/5 = 0.45。
那么MAP= (0.83+0.45)/2=0.64。
在检索结果中对检索结果进行正确排序,以评价检索系统的性能。
其中,q是用户的数量,rank是第I个用户在地面实况结果中的推荐列表中的第一项的排名位置。
例如,如果三次搜索的结果如下,所需结果(cat、torus和virus)的排名分别为3、2和1,则该系统的MRR为(1/3+1/2+1)/3 = 65438+。
更复杂的请参考这篇文章。
参考文章:
blogs.com/pinard/p/9128682.html
https://time.geekbang.org/column/article/5055