取 S SS 对角线上前 k kk 个元素。当 k = 2 k=2k=2 时候即将 S ( 6 × 4 ) S(6 \times 4)S(6×4) 降维成 S ( 2 × 2 ) S(2 \times 2)S(2×2),同时 U ( 6 × 6 ) , V t r a n s p o s e ( 4 × 4 ) U(6\times 6),Vtranspose(4\times 4)U(6×6),Vtranspose(4×4) 相应地变为 U ( 6 × 2 ) , V t r a n s p o s e ( 4 × 2 ) U(6\times 2),Vtranspose(4\times 2)U(6×2),Vtranspose(4×2). 可得到如下图:
其中, U UU 可以看作是 item 的某种潜在因子(隐向量表示),V看作 user 的某种潜在因子(隐向量表示),此时我们用降维后的 U , S , V U,S,VU,S,V 来相乘得到 A 2 A2A2,有:
A2=U(1:6,1:2)*S(1:2,1:2)*(V(1:4,1:2))' A2=5.28855.16270.21494.45913.27681.90213.74003.80583.53243.5479-0.13322.89841.1475-0.64174.94722.38465.07273.66403.78875.31305.10863.40194.61665.5822
可以看出, A 2 A2A2 和 A AA 很接近,所以,基于SVD的降维(PCA)还可以看作是数据的有损压缩。
将 U UU 的第一列当成 x xx 值,第二列当成 y yy 值,user1-4 对应 Ben | Tom | John | Fred,即 U UU 的每一行用一个二维向量表示,同理 V VV 的每一行也用一个二维向量表示,item1-6 对应Season 1 Season 2 Season 3 Season 4 Season 5 Season 6,有:
从图中可以看出,Season5,Season6特别靠近。Ben 和Fred 也特别靠近。同时我们仔细看一下 A AA ,可以发现, A AA 的第 5 行向量和第 6 行向量特别相似,Ben 所在的列向量和 Fred 所在的列向量也特别相似。
假设,现在有个名字叫Bob的新用户(其实,在现在的推荐系统中,会把这个用户放到矩阵 A AA 中参与计算,那样可以直接补全评分矩阵,从而直接进行推荐),并且已知这个用户对season n的评分向量为: [ 5 , 5 , 0 , 0 , 0 , 5 ] T [5,5,0,0,0,5]^T[5,5,0,0,0,5]T。(此向量为列向量)。现在任务是要对他做出个性化的推荐,首先是利用新用户的评分向量找出该用户的相似用户。
B o b 2 D = B o b T × U 2 × S k − 1 Bob_{2D}= Bob^T\times U_2\times S_k^{-1}Bob2D=BobT×U2×Sk−1
其中, B o b T = [ 5 , 5 , 0 , 0 , 0 , 5 ] Bob^T=[5,5,0,0,0,5]BobT=[5,5,0,0,0,5],上式:
Bob_{2D}=[5,5,0,0,0,5] X[[-0.4472-0.5373][-0.35860.2461][-0.2925-0.4033][-0.20780.6700][-0.50990.0597][-0.53160.1887]] X [[17.71390][06.3917]]=[0.37750.0802]
得到一个Bob的二维向量(隐向量表示),即知道Bob的坐标。将Bob坐标添加进原来的图中:
从图中用余弦相似度计算找出和Bob最相似的用户(基于user的协同过滤推荐,为什么要进行SVD呢?哈哈哈,这个例子不太好,但可以顺便回顾一下基于user的协同过滤推荐),计算出最相似的用户是ben。观察ben的评分向量为:【5 5 3 0 5 5】,对比Bob的评分向量:【5 5 0 0 0 5】。然后找出ben评分过而Bob未评分的 item 并排序,即【season 5:5,season 3:3】,即推荐给Bob的item依次为 season5 和season3。
总结:
SVD本身就是时间复杂度高的计算过程,如果数据量大的情况恐怕时间消耗无法忍受。不过可以使用梯度下降等机器学习的相关方法来进行近似计算,以减少时间消耗。paper [A Guide to Singular Value Decomposition for Collaborative Filtering] 中总结了几种SVD的方法,它们都是用梯度下降来进行求解的。相似度计算方法的选择,有多种相似度计算方法,每种都有对应优缺点,对针对不同场景使用最适合的相似度计算方法。在推荐系统中,最常用的相似度计算方法是余弦相似度。推荐策略:首先是相似用户可以多个,每个由相似度作为权重来共同影响推荐的 item 的评分。