SimRank協同過濾推薦算法

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

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

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

2. SimRank推薦算法思想

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

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

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

 

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

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

 

s(a,b)=1C|I(a)||I(b)|∑i=1|I(a)|∑j=1|I(b)|s(Ii(a),Ii(b))0a=ba≠b,I(a)≠,I(a)≠otherwises(a,b)={1a=bC|I(a)||I(b)|∑i=1|I(a)|∑j=1|I(b)|s(Ii(a),Ii(b))a≠b,I(a)≠,I(a)≠0otherwise

 

    如果我們想用上式直接計算兩個物品或者兩個用戶之間的相似度是比較困難的,一般需要通過迭代方式計算。對於a≠b,I(a)≠,I(a)≠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),Ii(b))=C|I(a)||I(b)|∑i=1N∑j=1Npias(a,b)pjbs(a,b)=C|I(a)||I(b)|∑i=1|I(a)|∑j=1|I(b)|s(Ii(a),Ii(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(a,b)=C∑i=1N∑j=1N(pia∑i=1Npia)s(a,b)(pjb∑j=1Npjb)

 

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

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

S=CWTSW+IDiag(diag(CWTSW))S=CWTSW+IDiag(diag(CWTSW))

 

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

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

3. SimRank算法流程

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

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

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

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

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

      a) temp=CWTSWtemp=CWTSW

      b) S=temp+IDiag(diag(temp))S=temp+IDiag(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要更加高大上。:)

(歡迎轉載,轉載請註明出處。歡迎溝通交流: [email protected]) 

 


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