推荐算法之矩阵分解(MF) svd biasSVD svd++说明和分析

1.概念解释

1.1 矩阵分解和svd

就是讲一个大矩阵分解为若干个小矩阵的点积,这样做的一个典型逻辑是降低参数量,相当于 Rm*n = Rm*k.dot( Rk*n ),将m*n个参数缩减为 (m + n) *k个参数,起到的效果几乎一致,深度(机器)学习中降低参数量,矩阵分解是很常用的技巧。这里k是超参,极端情况1的话,相当于m*n变为了m+n

大学矩阵分解常用的情况是方阵的特征值和特征向量,所谓Av=λv, A.dot[(v1, v2, ...)] = (λ1v1, λ2v2, ...), 则 A = (λ1v1, λ2v2, ...).dot[(v1, v2, ...) ^-1],再分开写就是 A = (v1, v2, ...).dot[(λ1,λ2,... 对角线矩阵)].dot[(v1, v2, ...)]

上面的写法和奇异值分解(svd)就比较像了,实际上上面的特征向量和特征值矩阵点积的形式就是奇异值分解的特例。对于非方阵(当然也包括方针)的情况 Rm*n = Am*m.dot(Bm*n).dot(Cn*n),其中中间的m*n就是奇异值在对角线构成的矩阵

奇异值和特征值是有含义的代表的是特征向量,注意不要大学线代口头禅说多了,忘了‘特征’向量的含义,这个‘特征’向量可以正好用于机器学习‘特征’这个概念。而且奇异值(特征值)代表了这个特征向量的权重,所以如果降维的话,很自然的一个考虑就是把主要特征向量留下来,其他的权重低的扔掉即可。

做法就是奇异值只取前k行k列,A特征向量矩阵只取前k列,C特征向量矩阵只取前k行,这样就变为了Rm*n = Am*k.dot(Bk*k).dot(Ck*n),为了减少一个矩阵,比如AB矩阵点积合并,得到 Rm*n = Um*k.dot(Dk*n),这就是svd用于协同过滤推荐场景逻辑推演过程。其中Um*k可以理解为所有用户信息表示矩阵,Dk*n表示商品的矩阵。

顺带说一下svd奇异值分解本身降维的用法和这里的区别,svd用于训练样本特征矩阵降维的话,处理思路是 Rm*k=Am*m.dot(Bm*k).dot(Ck*k), 会直接处理特征(商品)代表的矩阵,这样才能将特征数量降下来嘛。

综上矩阵分解是一个很宽泛的概念,其实可以任意定义分解的子矩阵个数和连接关系(点击还是啥),但是常用的还是svd逻辑的矩阵分解形式

1.2 biasSVD

上面的矩阵分解在推荐系统的场景就是对用户商品评分矩阵进行处理。biasSVD的意思是不同用户的评分习惯是不一样的,有的人就是比较严苛,啥都打的分比较低,有人相反,比如豆瓣和猫眼电影评分差距就知道了,猫眼是人是鬼分都不低(较之于豆瓣)。所以模型公式要本身把这种情况表征出来,设计参数代表这个含义,让模型可以自发去学习该参数。如何表征呢?

对于矩阵分解后的U矩阵和D矩阵,Sij = Ui * Dj,Sij含义是用户i对于商品j的评分。考虑偏好(bias)不一样之后, Sij = Ui * Dj + b + bi + bj,其中b代表平均分,bi代表用户i对平均分偏离度,bj代表商品本身内涵评分对于平均分的偏离度。损失函数没有变化,还是乘积后矩阵和本身矩阵的mse,用梯度下降法来求。

为何用梯度下降法来求两个矩阵?因为生产环境中,矩阵非常稀疏,不适合svd分解,且梯度下降法可以用本身的一些平均分等来初始化矩阵,效果效率没有那么差。

1.3 svd++

svd++考虑了这个情况。用户本身的对于哪些商品评分(往往是购买后的情况)本身就是一个隐语义信息,这个信息也可以表征到我的模型中。Sij = b + bi + bj + (Ui + 1/根号|N(u)|  * Σt∈N(i) yt) * Dj . 其中 N(i)代表用户i评价的商品列表,|N(u)| 代表列表长度,1/根号|N(u)| 是用来缩放的,Σt∈N(i) yt 是将y向量中所有属于用户i评分过的商品隐语义值求和。说一下参数量,对于模型的细节理解和实现脱不开对于模型参数量的理解。Um*k, Dk*n, b就一个,bi一共m个数,bj一共n个数,yt也是n个数,所以参数总量为 (m+n)*(k+1) + n + 1

2.其他学习博客链接

SVD与SVD++

SVD++推荐系统

发布了18 篇原创文章 · 获赞 1 · 访问量 7678

猜你喜欢

转载自blog.csdn.net/leitingdulante/article/details/105498559
SVD