推薦暫存

協同過濾推薦算法總結

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

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ΣVT的形式,而變是兩個低秩矩陣PTQ的乘積形式。對於矩陣分解的推薦算法,後續我會專門開篇來講。

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. 協同過濾總結 

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

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

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

 

矩陣分解在協同過濾推薦算法中的應用

    在協同過濾推薦算法總結中,我們講到了用矩陣分解做協同過濾是廣泛使用的方法,這裏就對矩陣分解在協同過濾推薦算法中的應用做一個總結。(過年前最後一篇!祝大家新年快樂!明年的目標是寫120篇機器學習,深度學習和NLP相關的文章)

1. 矩陣分解用於推薦算法要解決的問題

    在推薦系統中,我們常常遇到的問題是這樣的,我們有很多用戶和物品,也有少部分用戶對少部分物品的評分,我們希望預測目標用戶對其他未評分物品的評分,進而將評分高的物品推薦給目標用戶。比如下面的用戶物品評分表:

用戶\物品 物品1 物品2 物品3 物品4 物品5 物品6 物品7
用戶1 3   5     1  
用戶2   2         4
用戶3       4      
用戶4     2       1
用戶5 1       4    

    對於每個用戶,我們希望較準確的預測出用戶對未評分物品的評分。對於這個問題我們有很多解決方法,本文我們關注於用矩陣分解的方法來做。如果將m個用戶和n個物品對應的評分看做一個矩陣M,我們希望通過矩陣分解來解決這個問題。

2. 傳統的奇異值分解SVD用於推薦

    說道矩陣分解,我們首先想到的就是奇異值分解SVD。在奇異值分解(SVD)原理與在降維中的應用中,我們對SVD原理做了總結。如果大家對SVD不熟悉的話,可以翻看該文。

    此時可以將這個用戶物品對應的m×n矩陣M進行SVD分解,並通過選擇部分較大的一些奇異值來同時進行降維,也就是說矩陣M此時分解爲:

Mm×n=Um×kΣk×kVTk×n

  

    其中k是矩陣M中較大的部分奇異值的個數,一般會遠遠的小於用戶數和物品樹。如果我們要預測第i個用戶對第j個物品的評分mij,則只需要計算uTiΣvj即可。通過這種方法,我們可以將評分表裏面所有沒有評分的位置得到一個預測評分。通過找到最高的若干個評分對應的物品推薦給用戶。

    可以看出這種方法簡單直接,似乎很有吸引力。但是有一個很大的問題我們忽略了,就是SVD分解要求矩陣是稠密的,也就是說矩陣的所有位置不能有空白。有空白時我們的M是沒法直接去SVD分解的。大家會說,如果這個矩陣是稠密的,那不就是說我們都已經找到所有用戶物品的評分了嘛,那還要SVD幹嘛! 的確,這是一個問題,傳統SVD採用的方法是對評分矩陣中的缺失值進行簡單的補全,比如用全局平均值或者用用戶物品平均值補全,得到補全後的矩陣。接着可以用SVD分解並降維。

    雖然有了上面的補全策略,我們的傳統SVD在推薦算法上還是較難使用。因爲我們的用戶數和物品一般都是超級大,隨便就成千上萬了。這麼大一個矩陣做SVD分解是非常耗時的。那麼有沒有簡化版的矩陣分解可以用呢?我們下面來看看實際可以用於推薦系統的矩陣分解。

3. FunkSVD算法用於推薦

    FunkSVD是在傳統SVD面臨計算效率問題時提出來的,既然將一個矩陣做SVD分解成3個矩陣很耗時,同時還面臨稀疏的問題,那麼我們能不能避開稀疏問題,同時只分解成兩個矩陣呢?也就是說,現在期望我們的矩陣M這樣進行分解:

Mm×n=PTm×kQk×n

    我們知道SVD分解已經很成熟了,但是FunkSVD如何將矩陣M分解爲P和Q呢?這裏採用了線性迴歸的思想。我們的目標是讓用戶的評分和用矩陣乘積得到的評分殘差儘可能的小,也就是說,可以用均方差作爲損失函數,來尋找最終的P和Q。

    對於某一個用戶評分mij,如果用FunkSVD進行矩陣分解,則對應的表示爲qTjpi,採用均方差做爲損失函數,則我們期望(mij−qTjpi)2儘可能的小,如果考慮所有的物品和樣本的組合,則我們期望最小化下式:

∑i,j(mij−qTjpi)2

    只要我們能夠最小化上面的式子,並求出極值所對應的pi,qj,則我們最終可以得到矩陣P和Q,那麼對於任意矩陣M任意一個空白評分的位置,我們可以通過qTjpi計算預測評分。很漂亮的方法!

    當然,在實際應用中,我們爲了防止過擬合,會加入一個L2的正則化項,因此正式的FunkSVD的優化目標函數J(p,q)是這樣的:[Math Processing Error]

argminpi,qj∑i,j(mij−qTjpi)2+λ(||pi||22+||qj||22)

    其中λ爲正則化係數,需要調參。對於這個優化問題,我們一般通過梯度下降法來進行優化得到結果。

    將上式分別對pi,qj求導我們得到:

∂J∂pi=−2(mij−qTjpi)qj+2λpi

∂J∂qj=−2(mij−qTjpi)pi+2λqj

 

    則在梯度下降法迭代時,pi,qj的迭代公式爲:

pi=pi+α((mij−qTjpi)qj−λpi)

qj=qj+α((mij−qTjpi)pi−λqj)

    通過迭代我們最終可以得到P和Q,進而用於推薦。FunkSVD算法雖然思想很簡單,但是在實際應用中效果非常好,這真是驗證了大道至簡。

4. BiasSVD算法用於推薦

    在FunkSVD算法火爆之後,出現了很多FunkSVD的改進版算法。其中BiasSVD算是改進的比較成功的一種算法。BiasSVD假設評分系統包括三部分的偏置因素:一些和用戶物品無關的評分因素,用戶有一些和物品無關的評分因素,稱爲用戶偏置項。而物品也有一些和用戶無關的評分因素,稱爲物品偏置項。這其實很好理解。比如一個垃圾山寨貨評分不可能高,自帶這種爛屬性的物品由於這個因素會直接導致用戶評分低,與用戶無關。

    假設評分系統平均分爲μ,第i個用戶的用戶偏置項爲bi,而第j個物品的物品偏置項爲bj,則加入了偏置項以後的優化目標函數J(p,q)是這樣的[Math Processing Error]

argminpi,qj∑i,j(mij−μ−bi−bj−qTjpi)2+λ(||pi||22+||qj||22+||bi||22+||bj||22)

    這個優化目標也可以採用梯度下降法求解。和FunkSVD不同的是,此時我們多了兩個偏執項bi,bj,,pi,qj的迭代公式和FunkSVD類似,只是每一步的梯度導數稍有不同而已,這裏就不給出了。而bi,bj一般可以初始設置爲0,然後參與迭代。這裏給出bi,bj的迭代方法

bi=bi+α(mij−μ−bi−bj−qTjpi−λbi)

bj=bj+α(mij−μ−bi−bj−qTjpi−λbj)

    通過迭代我們最終可以得到P和Q,進而用於推薦。BiasSVD增加了一些額外因素的考慮,因此在某些場景會比FunkSVD表現好。

5. SVD++算法用於推薦

    SVD++算法在BiasSVD算法上進一步做了增強,這裏它增加考慮用戶的隱式反饋。好吧,一個簡單漂亮的FunkSVD硬是被越改越複雜。

    對於某一個用戶i,它提供了隱式反饋的物品集合定義爲N(i), 這個用戶對某個物品j對應的隱式反饋修正的評分值爲cij, 那麼該用戶所有的評分修正值爲∑s∈N(i)csj。一般我們將它表示爲用qTjys形式,則加入了隱式反饋項以後的優化目標函數J(p,q)是這樣的:[Math Processing Error]

argminpi,qj∑i,j(mij−μ−bi−bj−qTjpi−qTj|N(i)|−1/2∑s∈N(i)ys)2+λ(||pi||22+||qj||22+||bi||22+||bj||22+∑s∈N(i)||ys||22)

    其中,引入|N(i)|−1/2是爲了消除不同|N(i)|個數引起的差異。式子夠長的,不過需要考慮用戶的隱式反饋時,使用SVD++還是不錯的選擇。

6. 矩陣分解推薦方法小結

    FunkSVD將矩陣分解用於推薦方法推到了新的高度,在實際應用中使用也是非常廣泛。當然矩陣分解方法也在不停的進步,目前張量分解和分解機方法是矩陣分解推薦方法今後的一個趨勢。

    對於矩陣分解用於推薦方法本身來說,它容易編程實現,實現複雜度低,預測效果也好,同時還能保持擴展性。這些都是它寶貴的優點。當然,矩陣分解方法有時候解釋性還是沒有基於概率的邏輯迴歸之類的推薦算法好,不過這也不影響它的流形程度。小的推薦系統用矩陣分解應該是一個不錯的選擇。大型的話,則矩陣分解比起現在的深度學習的一些方法不佔優勢。

 

SimRank協同過濾推薦算法

    在協同過濾推薦算法總結中,我們講到了用圖模型做協同過濾的方法,包括SimRank系列算法和馬爾科夫鏈系列算法。現在我們就對SimRank算法在推薦系統的應用做一個總結。

1. SimRank推薦算法的圖論基礎

    SimRank是基於圖論的,如果用於推薦算法,則它假設用戶和物品在空間中形成了一張圖。而這張圖是一個二部圖。所謂二部圖就是圖中的節點可以分成兩個子集,而圖中任意一條邊的兩個端點分別來源於這兩個子集。一個二部圖的例子如下圖。從圖中也可以看出,二部圖的子集內部沒有邊連接。對於我們的推薦算法中的SimRank,則二部圖中的兩個子集可以是用戶子集和物品子集。而用戶和物品之間的一些評分數據則構成了我們的二部圖的邊。

2. SimRank推薦算法思想

    對於用戶和物品構成的二部圖,如何進行推薦呢?SimRank算法的思想是,如果兩個用戶相似,則與這兩個用戶相關聯的物品也類似;如果兩個物品類似,則與這兩個物品相關聯的用戶也類似。如果回到上面的二部圖,假設上面的節點代表用戶子集,而下面節點代表物品子集。如果用戶1和3類似,那麼我們可以說和它們分別相連的物品2和4也類似。

    如果我們的二部圖是G(V,E),其中V是節點集合,E是邊集合。則某一個子集內兩個點的相似度s(a,b)可以用和相關聯的另一個子集節點之間相似度表示。即:

s(a,b)=C|I(a)||I(b)|∑i=1|I(a)|∑j=1|I(b)|s(Ii(a),Ij(b))

    其中C是一個常數,而I(a),I(b)分別代表和a,b相連的二部圖另一個子集的節點集合。s(Ii(a),Ii(b))即爲相連的二部圖另一個子集節點之間的相似度。

    一種特殊情況是,自己和自己的相似度,我們定義爲1。即s(a,a)=1。還有一種特殊情況是I(a),I(b)有一個爲空,即a,b中某一個點沒有相連的另一個子集中的點,此時s(a,b)=0,將這幾種情況綜合下,則二部圖一個子集內兩個點的相似度s(a,b)可以表示爲:

 

s(a,b)=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪1C|I(a)||I(b)|∑i=1|I(a)|∑j=1|I(b)|s(Ii(a),Ij(b))0a=ba≠b,I(a)≠∅,I(a)≠∅otherwise

    如果我們想用上式直接計算兩個物品或者兩個用戶之間的相似度是比較困難的,一般需要通過迭代方式計算。對於a≠b,I(a)≠∅,I(a)≠∅時,我們注意到:

s(a,b)=C|I(a)||I(b)|∑i=1|I(a)|∑j=1|I(b)|s(Ii(a),Ij(b))=C|I(a)||I(b)|∑i=1N∑j=1Npias(a,b)pjb

    其中p爲二部圖關聯邊的權重,而N爲二部圖節點數。

    上面的式子可以繼續轉化爲:

s(a,b)=C∑i=1N∑j=1N(pia∑i=1Npia)s(a,b)(pjb∑j=1Npjb)

    如果用矩陣表示,則相似度矩陣S=CWTSW, 其中W是將權重值p構成的矩陣P歸一化後的矩陣。

    但是由於節點和自己的相似度爲1,即我們的矩陣S的對角線上的值都應該改爲1,那麼我們可以去掉對角線上的值,再加上單位矩陣,得到對角線爲1的相似度矩陣。即:

S=CWTSW+I−Diag(diag(CWTSW))

    其中diag(CWTSW)是矩陣CWTSW的對角線元素構成的向量,而Diag(diag(CWTSW))將這個向量構成對角矩陣。

    只要我們對S矩陣按照上式進行若干輪迭代,當S矩陣的值基本穩定後我們就得到了二部圖的相似度矩陣,進而可以利用用戶與用戶的相似度度量,物品與物品的相似度度量進行有針對性的推薦。

3. SimRank算法流程

    現在我們對SimRank算法流程做一個總結。

    輸入:二部圖對應的轉移矩陣W,阻尼常數C,最大迭代次數k

    輸出:子集相似度矩陣S:

    1) 將相似度S的初始值設置爲單位矩陣I.

    2) 對於i=1,2...k:

      a) temp=CWTSW

      b) S=temp+I−Diag(diag(temp))

    以上基於普通的SimRank算法流程。當然,SimRank算法有很多變種,所以你可能看到其他地方的SimRank算法描述或者迭代的過程和上面的有些不同,但是算法思想基本和上面相同。

    SimRank算法有很多改進變種,比較著名的一個改進是SimRank++算法。

4. SimRank++算法原理

    SimRank++算法對SimRank算法主要做了兩點改進。第一點是考慮了邊的權值,第二點是考慮了子集節點相似度的證據。

    對於第一點邊的權值,上面的SimRank算法,我們對於邊的歸一化權重,我們是用的比較籠統的關聯的邊數分之一來度量,並沒有考慮不同的邊可能有不同的權重度量,而SimRank++算法則在構建轉移矩陣W時會考慮不同的邊的不同權重值這個因素。

    對於第二點的節點相似度的證據。回顧回顧上面的SimRank算法,我們只要認爲有邊相連,則爲相似。卻沒有考慮到如果共同相連的邊越多,則意味着兩個節點的相似度會越高。而SimRank++算法利用共同相連的邊數作爲證據,在每一輪迭代過程中,對SimRank算法計算出來的節點相似度進行修正,即乘以對應的證據值得到當前輪迭代的的最終相似度值。

5. SimRank系列算法的求解

    由於SimRank算法涉及矩陣運算,如果用戶和物品量非常大,則對應的計算量是非常大的。如果直接用我們第二節講到了迭代方法去求解,所花的時間會很長。對於這個問題,除了傳統的一些SimRank求解優化以外,常用的有兩種方法來加快求解速度。

    第一種是利用大數據平臺並行化,即利用Hadoop的MapReduce或者Spark來將矩陣運算並行化,加速算法的求解。

    第二種是利用蒙特卡羅法(Monte Carlo, MC)模擬,將兩結點間 SimRank 的相似度表示爲兩個隨機遊走者分別從結點 a和 b出發到最後相遇的總時間的期望函數。用這種方法時間複雜度會大大降低,但是由於MC帶有一定的隨機性,因此求解得到的結果的精度可能不高。

6. SimRank小結

    作爲基於圖論的推薦算法,目前SimRank算法在廣告推薦投放上使用很廣泛。而圖論作爲一種非常好的建模工具,在很多算法領域都有廣泛的應用,比如我之前講到了譜聚類算法。同時,如果你理解了SimRank,那麼Google的PageRank對你來說就更容易理解了。

    個人理解PageRank只能得到某一個節點自己的權重,而SimRank卻可以得到兩兩之間的權重度量,明顯SimRank要更加高大上。:)

分解機(Factorization Machines)推薦算法原理

    對於分解機(Factorization Machines,FM)推薦算法原理,本來想自己單獨寫一篇的。但是看到peghoty寫的FM不光簡單易懂,而且排版也非常好,因此轉載過來,自己就不再單獨寫FM了。

Pinard注:上面最後一句話應該是"而gθ(x)則利用yˆ(x)−θhθ(x)來計算"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章