舉例講解協同過濾中相似度的計算方式

協同過濾中相似度的計算很有技巧性,下面對比幾種計算的方式。

假設輸入的Item-User矩陣爲:

這裏寫圖片描述

設用戶共有M個,Item共有N個,在本例子中,M=3,N=4M=3,N=4。矩陣中爲空的元素代表對應的用戶對Item沒有行爲,也可以認爲該用戶對該Item的評分爲0.

一、用二維數組依次計算

這種方式的實現步驟如下:

1、遍歷User,依次取出U1,U2,U3U1,U2,U3。當取到U1U1的時候,計算所有item之間的相似度,此處以餘弦方式度量相似度。因爲相似度矩陣是一個對稱矩陣,所以只計算上三角或者下三角即可。當計算U2U2的時候,需要累加U1U1的計算結果,U3U3同樣要累加前面的計算結果,這樣當user遍歷完成之後,即可得到兩個Item之間的內積,當然餘弦相似度還要除以兩個Item的模長的乘積。模長的計算可以在遍歷User的時候同步計算。

計算內積的具體過程爲:

這裏寫圖片描述

2、用內積除以模長得到餘弦相似度,這一步比較簡單,不詳細討論。

現在來分析一下這種方法的時間複雜度。很明顯要遍歷User,上面已經假設User的數量爲M,而對每一個User而言,要計算所有Item兩兩之間的相似度,因之需要計算相似度矩陣的上三角或下三角,所以其計算的次數爲:

這裏寫圖片描述
考慮所有的用戶,還要在上面的基礎上再乘以MM,所以最後的次數爲:
這裏寫圖片描述

二、採用HashMap查找計算

這種方法只計算User-Item矩陣中值不爲空的元素,對稀疏的矩陣而言,沒有冗餘的計算。但是需要額外構造一個ItemHashMap,從遍歷ItemHashMap開始。

在ItemHashMap中,Item爲key,User爲value。

1、遍歷ItemHashMap,依次取出I1,I2,I3,I4I1,I2,I3,I4。取到I1I1的時候,先從ItemHashMap中查找看過該Item的User有哪些,在本例子中爲U1,U3U1,U3。然後再分別計算這些User中每個User看過的Item之間的相似度,這一步很重要,是爲了避免計算User-Item矩陣中爲空的元素。

2、用戶U1U1看過的Item有I1,I3I1,I3,用戶U3U3看過的Item有I1,I2,I4I1,I2,I4。那麼作如下計算:

這裏寫圖片描述
3、同理,可以這樣計算I2,I3,I4I2,I3,I4。因爲是對稱矩陣,只需要計算相似度矩陣上三角或者下三角即可。如下所示:

這裏寫圖片描述

假設平均每個Item被P個用戶看過,平均每個用戶看過Q個Item,那麼應當有:

這裏寫圖片描述

分析上面的過程,不難發現,這種方式的計算次數爲:

這裏寫圖片描述

在實際的數據中,User-Item矩陣必然是稀疏,如果User-Item矩陣一點都不稀疏,也即沒有不爲空的元素,那麼也就失去了推薦的意義,因爲對於每一個用戶而言,他把所有的Item都看過了,那還給他推薦什麼呢?正常情況下,應該有P≪MP≪M,所以這種算法是有意義的。

上面兩種方法計算的相似度矩陣是一致的,如下所示:

這裏寫圖片描述

三、只使用UserHashMap實現

這種方式在實現第二種方式達到的效果之外,還可以節省空間。大概的思想是,遍歷UserHashMap,每取到一個User之後,先獲取該User所看過的Item,然後計算這些看過的Item兩兩之間的相似度,然後將結果保存在相似度矩陣中,後面的User生成的相似度直接累加上去即可,這樣最終的結果也就生成了。

更多文章參考https://www.cnblogs.com/lengyue365/p/5279435.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章