協同過濾推薦演算法總結

劉建平Pinard發表於2017-01-25

    推薦演算法具有非常多的應用場景和商業價值,因此對推薦演算法值得好好研究。推薦演算法種類很多,但是目前應用最廣泛的應該是協同過濾類別的推薦演算法,本文就對協同過濾類別的推薦演算法做一個概括總結,後續也會對一些典型的協同過濾推薦演算法做原理總結。

1. 推薦演算法概述

    推薦演算法是非常古老的,在機器學習還沒有興起的時候就有需求和應用了。概括來說,可以分為以下5種:

    1)基於內容的推薦:這一類一般依賴於自然語言處理NLP的一些知識,通過挖掘文字的TF-IDF特徵向量,來得到使用者的偏好,進而做推薦。這類推薦演算法可以找到使用者獨特的小眾喜好,而且還有較好的解釋性。這一類由於需要NLP的基礎,本文就不多講,在後面專門講NLP的時候再討論。

    2)協調過濾推薦:本文後面要專門講的內容。協調過濾是推薦演算法中目前最主流的種類,花樣繁多,在工業界已經有了很多廣泛的應用。它的優點是不需要太多特定領域的知識,可以通過基於統計的機器學習演算法來得到較好的推薦效果。最大的優點是工程上容易實現,可以方便應用到產品中。目前絕大多數實際應用的推薦演算法都是協同過濾推薦演算法。

    3)混合推薦:這個類似我們機器學習中的整合學習,博才眾長,通過多個推薦演算法的結合,得到一個更好的推薦演算法,起到三個臭皮匠頂一個諸葛亮的作用。比如通過建立多個推薦演算法的模型,最後用投票法決定最終的推薦結果。混合推薦理論上不會比單一任何一種推薦演算法差,但是使用混合推薦,演算法複雜度就提高了,在實際應用中有使用,但是並沒有單一的協調過濾推薦演算法,比如邏輯迴歸之類的二分類推薦演算法廣泛。

    4)基於規則的推薦:這類演算法常見的比如基於最多使用者點選,最多使用者瀏覽等,屬於大眾型的推薦方法,在目前的大資料時代並不主流。

    5)基於人口統計資訊的推薦:這一類是最簡單的推薦演算法了,它只是簡單的根據系統使用者的基本資訊發現使用者的相關程度,然後進行推薦,目前在大型系統中已經較少使用。

2. 協同過濾推薦概述

    協同過濾(Collaborative Filtering)作為推薦演算法中最經典的型別,包括線上的協同和離線的過濾兩部分。所謂線上協同,就是通過線上資料找到使用者可能喜歡的物品,而離線過濾,則是過濾掉一些不值得推薦的資料,比比如推薦值評分低的資料,或者雖然推薦值高但是使用者已經購買的資料。

    協同過濾的模型一般為m個物品,m個使用者的資料,只有部分使用者和部分資料之間是有評分資料的,其它部分評分是空白,此時我們要用已有的部分稀疏資料來預測那些空白的物品和資料之間的評分關係,找到最高評分的物品推薦給使用者。

    一般來說,協同過濾推薦分為三種型別。第一種是基於使用者(user-based)的協同過濾,第二種是基於專案(item-based)的協同過濾,第三種是基於模型(model based)的協同過濾

    基於使用者(user-based)的協同過濾主要考慮的是使用者和使用者之間的相似度,只要找出相似使用者喜歡的物品,並預測目標使用者對對應物品的評分,就可以找到評分最高的若干個物品推薦給使用者。而基於專案(item-based)的協同過濾和基於使用者的協同過濾類似,只不過這時我們轉向找到物品和物品之間的相似度,只有找到了目標使用者對某些物品的評分,那麼我們就可以對相似度高的類似物品進行預測,將評分最高的若干個相似物品推薦給使用者。比如你在網上買了一本機器學習相關的書,網站馬上會推薦一堆機器學習,大資料相關的書給你,這裡就明顯用到了基於專案的協同過濾思想。

    我們可以簡單比較下基於使用者的協同過濾和基於專案的協同過濾:基於使用者的協同過濾需要線上找使用者和使用者之間的相似度關係,計算複雜度肯定會比基於基於專案的協同過濾高。但是可以幫助使用者找到新類別的有驚喜的物品。而基於專案的協同過濾,由於考慮的物品的相似性一段時間不會改變,因此可以很容易的離線計算,準確度一般也可以接受,但是推薦的多樣性來說,就很難帶給使用者驚喜了。一般對於小型的推薦系統來說,基於專案的協同過濾肯定是主流。但是如果是大型的推薦系統來說,則可以考慮基於使用者的協同過濾,當然更加可以考慮我們的第三種型別,基於模型的協同過濾。

    基於模型(model based)的協同過濾是目前最主流的協同過濾型別了,我們的一大堆機器學習演算法也可以在這裡找到用武之地。下面我們就重點介紹基於模型的協同過濾。

3. 基於模型的協同過濾

    基於模型的協同過濾作為目前最主流的協同過濾型別,其相關演算法可以寫一本書了,當然我們這裡主要是對其思想做有一個歸類概括。我們的問題是這樣的m個物品,m個使用者的資料,只有部分使用者和部分資料之間是有評分資料的,其它部分評分是空白,此時我們要用已有的部分稀疏資料來預測那些空白的物品和資料之間的評分關係,找到最高評分的物品推薦給使用者。

    對於這個問題,用機器學習的思想來建模解決,主流的方法可以分為:用關聯演算法,聚類演算法,分類演算法,迴歸演算法,矩陣分解,神經網路,圖模型以及隱語義模型來解決。下面我們分別加以介紹。

3.1 用關聯演算法做協同過濾

    一般我們可以找出使用者購買的所有物品資料裡頻繁出現的項集活序列,來做頻繁集挖掘,找到滿足支援度閾值的關聯物品的頻繁N項集或者序列。如果使用者購買了頻繁N項集或者序列裡的部分物品,那麼我們可以將頻繁項集或序列裡的其他物品按一定的評分準則推薦給使用者,這個評分準則可以包括支援度,置信度和提升度等。

    常用的關聯推薦演算法有Apriori,FP Tree和PrefixSpan。如果大家不熟悉這些演算法,可以參考我的另外幾篇文章:

    Apriori演算法原理總結

    FP Tree演算法原理總結

    PrefixSpan演算法原理總結 

3.2 用聚類演算法做協同過濾

    用聚類演算法做協同過濾就和前面的基於使用者或者專案的協同過濾有些類似了。我們可以按照使用者或者按照物品基於一定的距離度量來進行聚類。如果基於使用者聚類,則可以將使用者按照一定距離度量方式分成不同的目標人群,將同樣目標人群評分高的物品推薦給目標使用者。基於物品聚類的話,則是將使用者評分高物品的相似同類物品推薦給使用者。

    常用的聚類推薦演算法有K-Means, BIRCH, DBSCAN和譜聚類,如果大家不熟悉這些演算法,可以參考我的另外幾篇文章:

    K-Means聚類演算法原理

    BIRCH聚類演算法原理

    DBSCAN密度聚類演算法

    譜聚類(spectral clustering)原理總結

3.3 用分類演算法做協同過濾

    如果我們根據使用者評分的高低,將分數分成幾段的話,則這個問題變成分類問題。比如最直接的,設定一份評分閾值,評分高於閾值的就是推薦,評分低於閾值就是不推薦,我們將問題變成了一個二分類問題。雖然分類問題的演算法多如牛毛,但是目前使用最廣泛的是邏輯迴歸。為啥是邏輯迴歸而不是看起來更加高大上的比如支援向量機呢?因為邏輯迴歸的解釋性比較強,每個物品是否推薦我們都有一個明確的概率放在這,同時可以對資料的特徵做工程化,得到調優的目的。目前邏輯迴歸做協同過濾在BAT等大廠已經非常成熟了。

    常見的分類推薦演算法有邏輯迴歸和樸素貝葉斯,兩者的特點是解釋性很強。如果大家不熟悉這些演算法,可以參考我的另外幾篇文章:

    邏輯迴歸原理小結

    樸素貝葉斯演算法原理小結

3.4 用迴歸演算法做協同過濾

    用迴歸演算法做協同過濾比分類演算法看起來更加的自然。我們的評分可以是一個連續的值而不是離散的值,通過迴歸模型我們可以得到目標使用者對某商品的預測打分。

    常用的迴歸推薦演算法有Ridge迴歸,迴歸樹和支援向量迴歸。如果大家不熟悉這些演算法,可以參考我的另外幾篇文章:

    線性迴歸原理小結

    決策樹演算法原理(下)

    支援向量機原理(五)線性支援迴歸

3.5 用矩陣分解做協同過濾

    用矩陣分解做協同過濾是目前使用也很廣泛的一種方法。由於傳統的奇異值分解SVD要求矩陣不能有缺失資料,必須是稠密的,而我們的使用者物品評分矩陣是一個很典型的稀疏矩陣,直接使用傳統的SVD到協同過濾是比較複雜的。

    目前主流的矩陣分解推薦演算法主要是SVD的一些變種,比如FunkSVD,BiasSVD和SVD++。這些演算法和傳統SVD的最大區別是不再要求將矩陣分解為$U\Sigma V^T$的形式,而變是兩個低秩矩陣$P^TQ$的乘積形式。對於矩陣分解的推薦演算法,後續我會專門開篇來講。

3.6 用神經網路做協同過濾

    用神經網路乃至深度學習做協同過濾應該是以後的一個趨勢。目前比較主流的用兩層神經網路來做推薦演算法的是限制玻爾茲曼機(RBM)。在目前的Netflix演算法比賽中, RBM演算法的表現很牛。當然如果用深層的神經網路來做協同過濾應該會更好,大廠商用深度學習的方法來做協同過濾應該是將來的一個趨勢。後續我會專門開篇來講講RBM。

3.7  用圖模型做協同過濾

    用圖模型做協同過濾,則將使用者之間的相似度放到了一個圖模型裡面去考慮,常用的演算法是SimRank系列演算法和馬爾科夫模型演算法。對於SimRank系列演算法,它的基本思想是被相似物件引用的兩個物件也具有相似性。演算法思想有點類似於大名鼎鼎的PageRank。而馬爾科夫模型演算法當然是基於馬爾科夫鏈了,它的基本思想是基於傳導性來找出普通距離度量演算法難以找出的相似性。後續我會專門開篇來講講SimRank系列演算法。 

3.8 用隱語義模型做協同過濾

    隱語義模型主要是基於NLP的,涉及到對使用者行為的語義分析來做評分推薦,主要方法有隱性語義分析LSA和隱含狄利克雷分佈LDA,這些等講NLP的再專門講。

4. 協同過濾的一些新方向

    當然推薦演算法的變革也在進行中,就算是最火爆的基於邏輯迴歸推薦演算法也在面臨被取代。哪些演算法可能取代邏輯迴歸之類的傳統協同過濾呢?下面是我的理解:

    a) 基於整合學習的方法和混合推薦:這個和混合推薦也靠在一起了。由於整合學習的成熟,在推薦演算法上也有較好的表現。一個可能取代邏輯迴歸的演算法是GBDT。目前GBDT在很多演算法比賽都有好的表現,而有工業級的並行化實現類庫。

    b)基於矩陣分解的方法:矩陣分解,由於方法簡單,一直受到青睞。目前開始漸漸流行的矩陣分解方法有分解機(Factorization Machine)和張量分解(Tensor Factorization)。

    c) 基於深度學習的方法:目前兩層的神經網路RBM都已經有非常好的推薦演算法效果,而隨著深度學習和多層神經網路的興起,以後可能推薦演算法就是深度學習的天下了?目前看最火爆的是基於CNN和RNN的推薦演算法。

5. 協同過濾總結 

    協同過濾作為一種經典的推薦演算法種類,在工業界應用廣泛,它的優點很多,模型通用性強,不需要太多對應資料領域的專業知識,工程實現簡單,效果也不錯。這些都是它流行的原因。

    當然,協同過濾也有些難以避免的難題,比如令人頭疼的“冷啟動”問題,我們沒有新使用者任何資料的時候,無法較好的為新使用者推薦物品。同時也沒有考慮情景的差異,比如根據使用者所在的場景和使用者當前的情緒。當然,也無法得到一些小眾的獨特喜好,這塊是基於內容的推薦比較擅長的。   

    

    以上就是協同過濾推薦演算法的一個總結,希望可以幫大家對推薦演算法有一個更深的認識,並預祝大家新年快樂!

(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com) 

相關文章