这一讲主要讲的是降维,减少推荐时的计算量。主要分为一下几个方面:
降维推荐的原因
SVD的特点
SVD处理的细节
降维的概率模型
降维推荐的原因
评分矩阵无法识别同义词
很多时候我们需要的是concepts,而非words。而通常的查找相似性的方法都是进行word相似性的查找。
在Information Retrieval领域其实早就对上述的问题进行了解决。Latent Semantic Indexing,主要解决的是语义上的相似性判别,而非字面上的相似度判别(concepts, not words)。他们采用的方法就是Singular Value Decompostion。通过SVD,可以创建一组更加紧凑的隐含特征,通过这些隐含特征再进行下一步的相似性判别。
SVD的特点
SVD,奇异值分解,主要的形式如下:
其中, R 是用户整体评分矩阵,维度为 m×n ( m 为用户数量,
将奇异值中比较小的那些去除,仅仅保留k个最大的奇异值,根据奇异值分解的意义可以知道此时 Um×kΣk×kVTn×k 是 R 的一个RMSE意义上的最有近似,此时,就有下式成立:
其中, U 维度为 m×k ,第 i 行表示用户
此时,用户i对物品j的评分就可以表示为:
$$p(i,j) = \sum _l \mathbf U(i,l) \mathbf \Sigma(l,l)\mathbf V(l,j)
采用SVD之后的推荐系统,拥有如下的特点:
减少了数据量(实际上是去除了各个特征之间的耦合,经过筛选出来的隐含特征之间并不存在耦合):数据少了,计算快了;
但是,也存在如下的挑战:
1 对missing value的处理;
2 SVD的计算量非常大;
3 得到的数据(隐含特征)难以解释(因为这些特征都是隐含的,并不像Content Based中的人工定义的那么直接)。
SVD处理的细节
用户未评分数据的处理
方法1:impute——不管不问,直接算
方法2:pre-normalization(与Collaberative Filtering中的normalization方法一致)
方法3:ignore(使用最优化的方法来进行计算)
更新机制(新用户还有用户的新评分)
这里主要是对用户的profile向量进行重构。主要采用的方法如下(这个过程就叫做fold in):
其中, Σk×kVn×k 与前面的意义相同, r→a 是用户 a 的评分向量,
k的选取
根据机器学习上面讲的,可以选取前k个奇异值,使得:
SVD的训练
由于直接进行矩阵的奇异值分解时间复杂度会相当高,因此采用了机器学习中的Stochastic Gradient Descend方法来进行计算。并且根据该种方法做出了一定的调整,最终的形式如下:
优化目标函数:
剩下的步骤可以参考任何一本机器学习中关于如何优化目标函数的做法了。
概率矩阵分解(Probabilistic Latent Semantic Analysis)
目标
估计
P(i|u)
——用户
u
选择物品
方法
其中, z <script type="math/tex" id="MathJax-Element-38">z</script> 相当于是一个隐含变量,连接起了用户和物品。
求解方法
使用EM算法,计算出p(i | z)和p(z | u) (这部分具体怎么做还需要参考[2])
参考文献
[1] Coursera上推荐系统导论第7讲
[2] 第7讲中关于概率潜在语意分析的参考资料