2013-05-04 72 views
20

我疑惑基於項目的建議是「在行動象夫」之間有什麼區別。還有書中的算法:什麼是協同過濾基於項目的推薦和基於內容的推薦

for every item i that u has no preference for yet 
    for every item j that u has a preference for 
    compute a similarity s between i and j 
    add u's preference for j, weighted by s, to a running average 
return the top items, ranked by weighted average 

什麼可以計算項目之間的相似度?如果使用內容,是不是基於內容的建議?

回答

91

基於項目的協同過濾

原來的基於項目的建議是基於用戶 - 項目排名完全(例如,額定電影有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)

希望這會有所幫助。

+1

來改變種子RandomUtils.useTestSeed(),感謝你的帖子,它非常詳細。 – cstur4 2013-05-14 12:21:32

+0

烹飪有2個不同的用戶? – 2014-05-06 04:38:48

4

「基於項目」的意思是「基於項目相似性」。你可以在這裏放置你喜歡的任何相似性度量。是的,如果它基於內容,就像術語矢量上的餘弦相似度那樣,您也可以將其稱爲「基於內容」。

+1

非常榮幸能夠得到您的答案。爲了比較兩種推薦方法的效果,我使用RMSRecommenderEvaluator進行評估。雖然參數相同,但不能保證相同的訓練數據和評估數據。我可以將它們與相同的數據進行比較嗎? – cstur4 2013-05-04 09:25:45

+0

你的意思是因爲隨機訓練集是不同的?在其他任何執行之前嘗試調用'RandomUtils.useTestSeed()'。 – 2013-05-04 10:36:13

+0

但我想運行幾個測試用例,並且我希望結果不同。 – cstur4 2013-05-04 12:38:44