SimRank協同過濾推薦算法

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

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

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

2、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)\)能夠表示爲:oop

\[ 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} \]post

    若是咱們想用上式直接計算兩個物品或者兩個用戶之間的類似度是比較困難的,通常須要經過迭代方式計算。對於$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) \]spa

    若是用矩陣表示,則類似度矩陣\(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要更加高大上。:)

(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)

相關文章
相關標籤/搜索