轉載請注明出處: http://www.cnblogs.com/gufeiyang
一個人想看電影的時候常常會思考要看什么電影呢。這個時候他可能會問周圍愛好的人求推薦。現在社會每天都會產生海量的信息。面對這么多信息好多人都不知道什么信息是自己需要的。推薦系統正是起了這么一個作用。推薦系統的應用隨處可見。網絡購物是一個典型的例子,電子商務的運營商往往會根據用戶在網站的行為推薦用戶可能會購買的商品。豆瓣FM是做的一個非常好的電台,這個電台能夠根據用戶的歷史行為學習出用戶喜歡歌曲的類型,從而給用戶推薦歌曲。除此之外還有電影推薦、新聞推薦、博客推薦等等。
本文主要介紹協同過濾算法。本博客以后會逐漸介紹一些其他的推薦算法。
協同過濾算法的出現標志着推薦系統的產生。協同過濾算法包含基於用戶的協同過濾算法和基於物品的協同過濾算法。
基於用戶的協同過濾算法基於這樣一個事實,如果A和B在電影方面的喜好相同,那么把B喜歡的的電影推薦給A是有道理的。 根據這個事實,基於用戶的協同過濾算法出現了。根據這個事實需要求出兩個用戶的相似度。這個相似度可以是公式1(jaccd)或者公式2(余弦公式)。 如果想計算每兩個用戶的相似度需要的時間復雜度為O(n*n*d)。n為用戶數目,d為商品的數目。
(公式1)
(公式2)

通過公式1或者2我們能得到一個相似度矩陣。然而在很多應用中這個相似度矩陣式非常稀疏的。也就是很多用戶相互之間沒有對相同的商品產生行為。如果我們直接先把相似度不為0的用戶對數求出來,然后只計算這些不為0的用戶對,這樣子會剩很多復雜度。 用數組C[u][v]記錄用戶u和v有相同商品行為的數目。首相建立一個倒排表。每個物品都保存被產生過行為的用戶。然后對於每個物品所有的用戶對數(u,v),C[u][v]加1。這樣結束以后就可以只利用相似度不為0的用戶對數了。
得到相似度矩陣后利用公式3預測用戶u對物品i的感興趣程度。其中S(u,k)表示與用戶u最接近的k個用戶N(i)表示對物品i有過行為的用戶集合。 wuv 表示用戶u和v的相似度,rvi表示用戶v對物品i的感興趣程度。
(公式3)
到此基於用戶的系統過濾算法基本就介紹完了。 公式1和公式2衡量用戶的用戶相似度其實上是比較粗糙的。舉個例子,小時候基本每個人都會買《新華字典》,其實並不能據此說明他們的興趣相似,然而如果兩個人都買了《模式識別》,那么就基本可以肯定他們的興趣是比較相似的。《新華字典》與《模式識別》的區別在於一個是火爆的物品,一個相對不火爆。因此相似度的計算方式可以修改為公式4。
1/(1+N(i) )懲罰了火爆的物品。
(公式4)
基於物品的協同過濾算法在應用中更頻繁。基於物品的協同過濾算法主要基於這樣的思想: 如果用戶x購買了物品A,那么她很可能會購買與A很相似的物品B(比如A是面膜,B是洗面奶)。這樣的話就需要計算物品間的相似度。
(公式5)
i和j分別表示兩個物品, 其中N(i) 表示喜歡物品i的人,N(j) 表示喜歡物品j的人。這個公式可以理解購買了i的用戶中有多少人購買了j。 這個公式其實有一個問題: 如果物品j是一個特別熱門的物品, 那么物品j跟很多物品的相似度都會很高, wij 很可能都會接近1。因此為了避免熱門物品造成的這種影響, 我們把公式修改為:
(公式6)
在得到了物品相似度后, 我們要計算用戶u對物品j的興趣程度:
(公式7)
其中N(u) 是用戶u喜歡的物品集合, S(j,k)是與物品j最相似的k個物品的集合。 wij是物品i和j的相似度。 rui 是用戶u對物品i的興趣度。基本思想就是,如果要計算用戶u與物品j的興趣度, 先找到與j最相似的k個物品,再看用戶u與這些物品的感興趣程度,加權得到用戶u對物品j的興趣程度。
這里需要提出一個問題,如果用戶u是一個書商,那么在計算物品相似度的時候,這個書上對他購買書中的任何兩本書計算相似的時候都會做出貢獻。 其實這事不合理的。 如果他購買了《數據挖掘導論》和一本《紅樓夢》,這個信息其實意義不大的, 我們並不能因此而直接地增加這兩本書的相似度。 這里我們需要對用戶的熱度做懲罰。
(公式8)
公式8是對公式6的修正, 懲罰了熱門的用戶。
上述討論只是用了無下文的隱性數據。 在計算物品相似度和用戶相似度的時候有很多公式。實際應用中發現,基於用戶的協同的過濾利用皮爾遜相關系數效果比較好。而基於物品的協同過濾利用余弦相似度效果會比較好。
參考資料:
《推薦系統實戰》 項亮著

