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


假設有兩個標的物

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

文章插圖
, 它們對應的向量(即圖2中矩陣的列向量, 分別是第i列和第j列)如下, 其中n是用戶數 。

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

文章插圖

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

文章插圖
那么

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

文章插圖
的相似度計算, 我們可以細化如下:

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

文章插圖
公式1:計算

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

文章插圖
相似度
我們仔細看一下上述公式, 公式的分子就是下圖矩陣中對應的i列和j列中同一行中的兩個元素(紅色矩形中的一對元素)相乘, 并且將所有行上第i列和第j列的元素相乘得到的乘積相加(這里其實只需要考慮同一行對應的i列和j列的元素都非零的情況, 如果只要第i列和第j列中有一個為零, 乘積也為零) 。 公式中分母是第i行與第i行按照上面類似的方法相乘再相加后開根號的值, 再乘以第j行與第j行按照上面類似的方法相乘再相加后開根號的值 。
圖3:計算兩個列向量的cosine余弦可以拆解為簡單的加減乘及開根號運算
有了上面的簡單分析, 就容易分布式計算相似度了 。 下面我們就來講解, 在Spark上怎么簡單地計算每個標的物的topK相似度 。 在Spark上計算相似度, 最主要的目標是怎么將上面巨大的計算量(前面已經提到在互聯網公司, 往往用戶數和標的物數都是非常巨大的)通過分布式技術實現, 這樣就可以利用多臺服務器的計算能力, 解決大計算問題 。
首先將所有用戶操作過的標的物”收集“起來, 形成一個用戶行為RDD, 具體的數據格式如下:

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

文章插圖
其中uid是用戶唯一識別編碼, sid是標的物唯一識別編碼, R是用戶對標的物的評分(即矩陣中的元素) 。
對于

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

文章插圖
中的某個用戶來說, 他操作過的標的物

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

文章插圖


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

文章插圖
, 一定在該用戶所在的行對應的列i和列j的元素非零, 根據上面計算

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

文章插圖
相似度的公式, 需要將該用戶對應的

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

文章插圖
的評分乘起來 。 這個過程可以用下面的圖4來說明 。
圖4:對用戶U來說, 將他所有操作過的標的物做笛卡爾積
當所有用戶都按照圖4的方式轉化為標的物對及得分(圖4中右邊的

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

文章插圖
)時, 我們就可以對標的物對Group(聚合), 將相同的對合并, 對應的得分相加, 最終得到的RDD為:

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

文章插圖
這樣, 公式1中分子就計算出來了(上式中的Score即是公式1中的分子) 。 現在我們需要計算分母, 這非常簡單, 只要從上面的RDD中將標的物sid1等于標的物sid2的列過濾出來就可以了, 通過下圖的操作, 我們可以得到一個map

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

文章插圖

圖5:從

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

文章插圖
中過濾出

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

文章插圖
的元素, 用于計算公式1中的分母

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

文章插圖
最多含有標的物的數量(m)個的元素, 相對來說不大, 我們可以將

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

文章插圖
廣播(broadcast)出去 。

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

文章插圖
方便我們按照公式1除以分母, 最終得到

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

推薦閱讀