分享協同過濾思想簡介 什么是協同過濾?( 四 )


文章插圖
的相似度 。
通過上面這些步驟, 公式1中的分子和分母基本都很容易計算出來了, 我們通過下圖的代碼(下面的broadcast即是

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
), 就可以計算出每組

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
對的相似度, 最終得到的RDD為:

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
, 其中Sim為sid1和sid2的相似度 。

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
圖6:計算每組

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
的相似度
有了上面的準備, 下面我們來說明一下怎么計算每個標的物的topK最相似的標的物 。
具體的計算過程可以用如下的Spark Transformation來實現 。 其中第三步的TopK需要我們自己實現一個函數, 求

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
這樣的列表中評分最大的TopK個元素, 實現也是非常容易的, 這里不贅述 。

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
如果我們把每個標的物最相似的K個標的物及相似度看成一個列向量的話, 那么我們計算出的標的物相似度其實可以看作如下矩陣, 該矩陣每列K個非零元素 。

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
圖7:標的物相似度矩陣
到此為止, 我們通過Spark提供的一些Transformation操作及一些工程實現上的技巧計算出了每個標的物topK最相似的標的物 。 該計算方法可以橫向拓展, 所以再大的用戶數和標的物數都可以輕松應對, 最多可能需要多加一些服務器 。
2.為用戶生成推薦
有了1中計算出的標的物topK最相似的標的物, 下面我們來說明一下怎么為用戶生成個性化推薦 。 生成個性化推薦有兩種工程實現策略, 一種是看成矩陣的乘積, 另外一種是根據第二節2中”基于標的物的協同過濾“中的公式來計算, 這兩種方法本質上是一樣的, 只是工程實現上不一樣 。 下面我們分別講解這兩種實現方案 。
(1) 通過矩陣相乘為用戶生成推薦上面圖2中的矩陣是用戶行為矩陣, 第i行第j列的元素代表了用戶i對標的物j的偏好/評分, 我們將該矩陣記為

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
, 其中n是用戶數, m是標的物數 。 圖7中的矩陣是標的物之間的相似度矩陣, 我們將它記為

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
, 這是一個方陣 。

分享協同過濾思想簡介 什么是協同過濾?

文章插圖


分享協同過濾思想簡介 什么是協同過濾?

文章插圖
其實都是稀疏矩陣, 我們通過計算這兩個矩陣的乘積(Spark上是可以直接計算兩個稀疏矩陣的乘積的), 最終的結果矩陣就可以方便用來為用戶推薦了:

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
。 其中的第i行

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
代表的是用戶i對每個標的物的偏好得分, 我們從這個列表中過濾掉用戶操作過的標的物, 然后按照得分從高到低降序排列取topN就是最終給用戶的推薦 。
(2) 通計算公式為用戶生成推薦標的物相似度矩陣

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
是稀疏矩陣, 最多

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
個非零元素(因為每個標的物只保留K個最相似的標的物), 一般K取幾十或者上百規模的數值, m如果是十萬或者百萬量級, 存儲空間在1G左右(例如, 如果m=100萬, K=100, 相似度為雙精度浮點數, 那么

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
非零元素占用的空間為100萬*100*8Byte=763M), 完全可以通過廣播的形式將

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
broadcast到每個Spark計算節點中 。 我們先將相似矩陣轉化為下圖的Map結構, 再廣播出去, 方便利用公式計算相似度 。

推薦閱讀