基於項目的協同過濾
原來的基於項目的建議是基於用戶 - 項目排名完全(例如,額定電影有3星,或用戶的用戶「喜歡」的視頻) 。在計算項目之間的相似度時,除了所有用戶的評分歷史記錄之外,您都不應該知道其他內容。因此,項目之間的相似性是根據評分來計算的,而不是項目內容的元數據。
讓我給你舉個例子。假設你只有一些評級數據訪問象下面這樣:
user 1 likes: movie, cooking
user 2 likes: movie, biking, hiking
user 3 likes: biking, cooking
user 4 likes: hiking
假設現在你想4.
首先創建的項目倒排索引的用戶建議,您將獲得:
movie: user 1, user 2
cooking: user 1, user 3
biking: user 2, user 3
hiking: user 2, user 4
既然這是一個二元等級(或不是),我們可以使用類似度量類似Jaccard Similarity來計算項目相似度。
|user1|
similarity(movie, cooking) = --------------- = 1/3
|user1,2,3|
在分子中,用戶1是唯一的元件,其電影和烹飪既有。在分母中,電影和烹飪聯合有3個不同的用戶(user1,2,3)。這裏的|.|
表示組的大小。所以我們知道電影和烹飪的相似度在我們的案例中是三分之一。您只需爲所有可能的項目對(i,j)
做同樣的事情。
你與相似度計算做了所有對後,說,你需要做一個推薦用戶4.
- 看相似度得分的
similarity(hiking, x)
其中x是任何其他標記,你可能有。
如果您需要爲用戶3提出建議,可以彙總其列表中每個項目的相似度得分。例如,
score(movie) = Similarity(biking, movie) + Similarity(cooking, movie)
score(hiking) = Similarity(biking, hiking) + Similarity(cooking, hiking)
基於內容的基於內容的推薦
的一點是,我們必須知道用戶和項目的內容。通常情況下,您會使用共享屬性空間的內容構建用戶配置文件和項目配置文件。例如,對於電影,您可以用電影明星和流派(例如使用二進制編碼)來表示電影。對於用戶簡檔,可以基於用戶喜歡某些電影明星/流派等來做同樣的事情。然後,可以使用例如餘弦相似度來計算用戶和項目的相似度。
這裏是一個具體的例子:
想這是我們的用戶配置文件(使用二進制編碼,0表示不樣,1種手段等),其中包含用戶的偏愛超過5電影明星和5的電影類型:
Movie stars 0 - 4 Movie Genres
user 1: 0 0 0 1 1 1 1 1 0 0
user 2: 1 1 0 0 0 0 0 0 1 1
user 3: 0 0 0 1 1 1 1 1 1 0
想這是我們的電影簡介:
Movie stars 0 - 4 Movie Genres
movie1: 0 0 0 0 1 1 1 0 0 0
movie2: 1 1 1 0 0 0 0 1 0 1
movie3: 0 0 1 0 1 1 0 1 0 1
要計算一部電影有多好用戶,我們使用cosine similarity:
dot-product(user1, movie1)
similarity(user 1, movie1) = ---------------------------------
||user1|| x ||movie1||
0x0+0x0+0x0+1x0+1x1+1x1+1x1+1x0+0x0+0x0
= -----------------------------------------
sqrt(5) x sqrt(3)
= 3/(sqrt(5) x sqrt(3)) = 0.77460
同理:
similarity(user 2, movie2) = 3/(sqrt(4) x sqrt(5)) = 0.67082
similarity(user 3, movie3) = 3/(sqrt(6) x sqrt(5)) = 0.54772
如果你想給用戶一個i
推薦,隨便挑電影j
具有最高similarity(i, j)
。
希望這會有所幫助。
來改變種子RandomUtils.useTestSeed(),感謝你的帖子,它非常詳細。 – cstur4 2013-05-14 12:21:32
烹飪有2個不同的用戶? – 2014-05-06 04:38:48