SimRank協同過濾推薦演算法

劉建平Pinard發表於2017-02-03

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

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

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

2. SimRank推薦演算法思想

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

    如果我們的二部圖是$G(V,E)$,其中V是節點集合,E是邊集合。則某一個子集內兩個點的相似度$s(a,b)$可以用和相關聯的另一個子集節點之間相似度表示。即:$$s(a,b) = \frac{C}{|I(a)||I(b)|}\sum\limits_{i=1}^{|I_(a)|}\sum\limits_{j=1}^{|I_(b)|}s(I_i(a),I_j(b))$$

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

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

$$s(a,b)=
\begin{cases}
1 & {a = b}\\
\frac{C}{|I(a)||I(b)|}\sum\limits_{i=1}^{|I_(a)|}\sum\limits_{j=1}^{|I_(b)|}s(I_i(a),I_j(b)) & {a \neq b, I(a) \neq \emptyset, I(a) \neq \emptyset}\\ 0 & {otherwise} \end{cases}$$

    如果我們想用上式直接計算兩個物品或者兩個使用者之間的相似度是比較困難的,一般需要通過迭代方式計算。對於$a \neq b, I(a) \neq \emptyset, I(a) \neq \emptyset $時,我們注意到:$$s(a,b) = \frac{C}{|I(a)||I(b)|}\sum\limits_{i=1}^{|I_(a)|}\sum\limits_{j=1}^{|I_(b)|}s(I_i(a),I_j(b)) = \frac{C}{|I(a)||I(b)|}\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}p_{ia}s(a,b)p_{jb}$$

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

    上面的式子可以繼續轉化為:$$s(a,b) = C\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}\Bigg(\frac{p_{ia}}{\sum\limits_{i=1}^{N}p_{ia}}\Bigg)s(a,b)\Bigg(\frac{p_{jb}}{\sum\limits_{j=1}^{N}p_{jb}}\Bigg)$$

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

    但是由於節點和自己的相似度為1,即我們的矩陣S的對角線上的值都應該改為1,那麼我們可以去掉對角線上的值,再加上單位矩陣,得到對角線為1的相似度矩陣。即:$$S = CW^TSW + I - Diag(diag(CW^TSW))$$

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

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

3. SimRank演算法流程

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

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

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

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

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

      a) $temp = CW^TSW$

      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要更加高大上。:)

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

 

相關文章