如果說過去的十年是搜索技術大行其道的十年,那么個性化推薦技術將成為未來十年中最重要的革新之一。目前幾乎所有大型的電子商務系統,如Amazon、CDNOW、Netflix等,都不同程度地使用了各種形式的推薦系統。而近來以“發現”為核心的網站正開始在互聯網上嶄露頭角,比如側重于音樂推薦的八寶盒,側重于圖書推薦的豆瓣等等。
?
那么,一個好的推薦系統需要滿足什么目標呢?
個性化推薦系統必須能夠基于用戶之前的口味和喜好提供相關的精確的推薦,而且這種口味和喜歡的收集必須盡量少的需要用戶的勞動。推薦的結果必須能夠實時計算,這樣才能夠在用戶離開網站前之前獲得推薦的內容,并且及時的對推薦結果作出反饋。實時性也是推薦系統與通常的數據挖掘技術顯著不同的一個特點。
?
一個完整的推薦系統由三部分構成:行為記錄模塊、模型分析模塊和推薦模塊。行為記錄模塊負責記錄能夠體現用戶喜好的行為,比如購買、下載、評分等。這部分看起來簡單,其實需要非常仔細的設計。比如說購買和評分這兩種行為表達潛在的喜好程度就不盡相同完善的行為記錄需要能夠綜合多種不同的用戶行為,處理不同行為的累加。模型分析模塊的功能則實現了對用戶行為記錄的分析,采用不同算法建立起模型描述用戶的喜好信息。最后,通過推薦模塊,實時的從內容集篩選出目標用戶可能會感興趣的內容推薦給用戶。因此,除了推薦系統本身,為了實現推薦,還需要一個可供推薦的內容集。比如,對于音樂推薦系統來說,一個音樂庫就是這樣的內容集。我們對內容集本身需要提供的信息要求非常低,在經典的協同過濾算法下,內容集甚至只需要提供ID就足夠。而對于基于內容的推薦系統來說,由于往往需要對內容進行特征抽取和索引,我們就會需要提供更多的領域知識和內容屬性。這種情況下,還是拿音樂舉例,歌手、流派之類的屬性和音頻信息就成為必需的內容集信息。
迄今為止在個性化推薦系統中,協同過濾(Collaborative Filtering)技術是應用最成功的技術。目前國內外互聯網上有許多大型網站已經應用這項技術為用戶更加智能的推薦內容。如果你想要研究協同過濾,一定不能錯過MovieLens(
http://movielens.umn.edu/)。它是協同過濾最著名的研究項目之一。
?
第一代的協同過濾技術,又被稱為基于用戶(User-based)的協同過濾。基于用戶的協同過濾,基本原理是基于用戶行為選擇的相關性。用戶的行為選擇這里指的是下載、購買、評價等等能夠顯式或者隱式體現出用戶喜好的行為。在一個典型的基于協同過濾技術的推薦系統中,輸入數據通常可以表述為一個m×n 的用戶內容矩陣R,m是用戶數,n是內容數。矩陣的值與內容的類型有關,通常由行為記錄模塊決定。如果內容是網上書店中的書,則矩陣的值可以表示用戶購買與否,例如1表示購買,0表示沒有購買;或者表示用戶對它的評價有多高,這樣的評價值就可以有幾個等級,比如常見的1~5級評價制。
?
基于用戶的協同過濾,通過比較目標用戶的一系列行為選擇和其他用戶之間的相似性,來識別出一組相互具有類似喜好的用戶,又可以稱為“同好”。一旦系統能夠識別一個用戶的同好用戶,就能夠將他們最感興趣的內容作為當前用戶的推薦結果推薦給這個用戶。也就是說,以前的行為選擇與你相似的用戶,在以后的行為中很可能也會和你相似。因此將這些用戶做為基準來向你推薦內容。
?
協同過濾的核心問題是尋找與目標用戶興趣相近的一組用戶。這種相似用戶通常被稱為最近鄰居(Nearest Neighbor)。用戶之間的相似度是通過比較兩個用戶的行為選擇矢量得到的。目前,比較行為選擇矢量的相似度計算方法有許多種,比較經典的算法包括泊松相關系數(Person Correlation Coefficient)和余弦相似性(Cosine-based Similarity)。
?
“最近鄰居”產生后,我們就能夠計算得到用戶最可能感興趣的內容集(也叫做TopN推薦集)。為了得到推薦集,分別統計“最近鄰居”中的用戶對不同內容的興趣度,取其中排在最前面的內容作為推薦集。下面是一個簡化的示例:假如用戶張三有兩個同好:李四和王五。
?
張三喜歡看電影A;
李四喜歡看電影A,B,C和D;
王五喜歡看電影A,B,D,E和F;
?
這樣,推薦系統就能夠過濾出相似用戶都喜歡的電影B和D作為張三最可能也會喜歡的電影推薦給張三。
?
基于用戶的協同過濾技術在個性化推薦系統中獲得了極大的成功,但它有自身的局限性。推薦集的產生方式意味著一個內容只有已經被用戶選擇(購買)后才有機會被推薦給其他用戶。對于一個網上書店來說,新上架的書因為還沒有被相當數量的用戶購買或者評價的記錄,便很少有機會被用戶的“最近鄰居”篩選進入推薦集。這個問題,也被稱之為協同過濾的“冷啟動”問題。
?
此外,因為計算用戶的相似度時,是通過將目標用戶的歷史行為記錄與其他每一個用戶的記錄相比較得出的,所以對于一個現實的推薦系統來說,擴展性將成為非常嚴重的問題。設想一下,對于一個擁有上百萬用戶的網站來說,每計算一個用戶都將涉及到上百萬次的比較,更不要說其中會帶來的大量數據庫IO操作的開銷。
?
于是第二代基于內容項(Item-based)的協同過濾技術就產生了。與基于用戶的技術不同的是,這種方法比較的是內容項與內容項之間的相似度。Item-based 方法同樣需要進行三個步驟獲得推薦:1)得到內容項(Item)的歷史評分數據;2)針對內容項進行內容項之間的相似度計算,找到目標內容項的“最近鄰居”;3)產生推薦。這里內容項之間的相似度是通過比較兩個內容項上的用戶行為選擇矢量得到的。舉個例子,假設用戶和內容項如下:
?
?
|
電影A
|
電影B
|
電影C
|
電影D
|
張三
|
喜歡
|
?
|
?
|
?
|
李四
|
喜歡
|
喜歡
|
喜歡
|
喜歡
|
王五
|
不喜歡
|
?
|
不喜歡
|
不喜歡
|
趙六
|
喜歡
|
喜歡
|
?
|
喜歡
|
?
可以看出,電影A與D是最相似的。因為張三喜歡A,所以電影D就可以推薦給張三。
?
?
不論是第一代的基于用戶方法,還是第二代的基于內容項方法,都不可避免的遇到數據稀疏的問題。在任何一個網站中,用戶的評分記錄或者購買記錄,相對整個可供選擇的內容集來說,都是很小的一部分。所以在許多推薦系統中,每個用戶涉及的數據量相當有限,在一些大的系統如Amazon中,用戶最多不過就評價過上百萬本書的1%,造成評估數據相當稀疏。當用戶評價過的內容之間找不到交集時,就難以判斷用戶的口味是否相似,難以找到相似用戶集,導致推薦效果大大降低。為了解決用戶數據的稀疏問題,最方便的辦法就是將用戶對沒有選擇過的內容項的評分設為一個固定的缺省值,例如用戶的平均評分。針對如何預測遺漏的評分業內又提出了很多種方法,不過一般來說采用最簡單的改進方法就可以有效地提高協同過濾推薦系統的準確度。
?
另外一方面,即便采用了基于內容項的方法,在數據量巨大的時候,計算復雜度仍然成為性能瓶頸。為了進一步解決協同過濾技術的擴展性能問題,目前比較有效的辦法是在用戶評分數據上做一次聚類分析(clustering)。聚類技術首先將具有相似興趣愛好的用戶分配到相同的分類中。聚類產生之后,它或者將“最近鄰居”搜索對象限制在最相近的聚類中,根據類中其他用戶的評價預測目標用戶的評價,或者用聚類的中心作為近似提取推薦結果。由于用戶之間的分類相對變化比較小,因此聚類過程往往可以離線進行,而無需實時計算,這樣就大大降低了實時推薦的計算壓力,提高推薦系統的速度。一般來說,聚類將用戶分為多少個類,推薦系統的整體速度就能夠提高多少倍。具體選擇什么樣的聚類算法,又會因應用領域和數據的分布特性而不同。如果聚類算法選擇不當,反而會降低推薦的準確性。近年來,推薦系統的算法技術的發展也有了一些新的方向,比如SlopeOne,SVD等方法,就不一一列舉了。
?
在我看來,一個商用推薦系統的尤其關鍵之處在于對海量用戶數據的處理。因為推薦系統是數據優先,數據的積累越多對推薦的精度就越有好處。而當用戶的行為數據真正積累到上百萬甚至上億時,如何在合理時間內得出有效的推薦,就是對推薦技術最大的考驗。除此之外,一個優秀的推薦系統需要能夠結合內容相似與用戶行為相。傳統的協同過濾方法是忽略內容本身的屬性的,這一方面固然是對數據要求少的優點,但另一方面也帶來了難以避免的“冷啟動”問題。其實,隨著標簽系統在互聯網上的廣泛應用,標簽本身就不失為是一種很好的內容屬性。如何利用也是值得大家探討的。充分利用到內容本身的屬性,將不同的相似性結合起來,這會給基于協同過濾的推薦技術帶來新的動力。最后一點,設計良好的推薦技術要能夠從用戶對推薦內容的反饋中自行調整和學習。因為實際上每個用戶對于推薦的內容都有不同的要求,比如有的用戶可能偏好比較熱門的內容,有的用戶更愿意發現冷門的內容。針對不同用戶的反饋來不斷學習每個用戶的特征,才能夠避免所采用算法本身先天的偏差,獲得較為理想的效果。