1. 程式人生 > >PageRank與社交網路模型評估

PageRank與社交網路模型評估

SNS社交網路在近幾年流行起來,並呈現出火爆的增長趨勢。在仿製國外Facebook、twitter等成功先例的基礎上,國內的人人網、新浪微博等一系列社交網路正風生水起。

facebook

這些社交網站表面上看起來十分普通和其他網站別無二致,但我們可以研究它們背後更深層次的數學原理,從而更有利於推廣營銷。在後面的分析中,我會分別舉例,大家就會明白實際中的應用價值。

我們需要考慮的是怎樣度量一個網路。網路其實就是一張圖,圖中有各個節點,節點連線起來,形成。在社交網路中,每個人就是一個節點,人們通過好友關係相互連線。節點是有權重的,就像人具有影響力一樣。

renren

給你一張網路拓撲圖,你怎樣挖掘這張圖所蘊含的資訊呢?你怎樣知道圖中哪一個節點是最重要的?事實上有很多方法,我們自己也可以定義度量的標準。經常用到的有Degree Centrality,Eigenvector Centrality,Katz Centrality,PageRank,Closeness Centrality,Betweenness Centrality,Transitivity……它們從簡單到複雜,從偏重某個屬性到綜合考慮,很多都在現實中合理地使用著,例如PageRank就是Google使用的網頁排名方法。

1. Degree Centrality(節點度)

這是對網路最為簡單直白的一種度量:僅僅統計每個節點有多少邊。它的現實意義在於有更多邊的節點具有更大的連線性,就像有更多好友的人具有更大的影響力。例如對一個產品做推廣營銷,我們發放免費的試用樣品給消費者,如果消費者滿意他們就會購買,並且推薦給自己的朋友也去購買。這就是口碑影響力。作為廠家,我們當然希望將樣品發放給更具影響力的人,因為他們的一句讚美會傳遞到更多的節點上,為我們帶來更多的潛在客戶。我們知道,圖分為有向圖和無向圖,他們的區別在於節點之間的聯絡是否是雙向的。例如Facebook或者人人網中的好友關係,就是一個無向圖,你是我的好友那麼我也是你的好友;而twitter或者新浪微博則是一個有向圖,因為我“關注”(follow)某些人,又有另外一些人“關注”我,這是一個從一個節點指向另一個節點的關係,不具有可逆性。我們在討論Degree Centrality時,對於有向圖來說,其實有in-degree centrality和out-degree centrality兩種。例如在微博上很多人關注了李開復,也就是說有很多節點指向他,那麼李開復就具有很高的in-degree centrality. 但是要小心,in-degree高的節點不一定是最有價值的,例如在論文參考文獻引用中,一篇文章的in-degree很高表示很多人引用了這篇論文。這篇文章可能提出了一個有價值的研究問題,但是卻犯了明顯的錯誤,於是大家在寫這個研究方向的論文時都會說:“快去圍觀這篇文章,作者太SB了,哈哈哈哈……”

我們希望通過Degree Centrality來找出最有影響力的節點們。問題來了,想要獲得具有Degree Centrality最高的前10個節點,我們需要知道整張圖的結構才行。從數學上講,即需要得到圖的鄰接矩陣A,對於A中的每一行統計有多少個1,最後進行排序取前k個即可得到Degree Centrality值最高的前k個節點。這在實際中並不可行,你並不是Facebook的所有者或者人人網的管理員,你怎麼知道整個社會網路裡誰的好友更多?

2. Eigenvector Centrality(特徵向量)

這是對Degree Centrality的一種改進版。我們希望得到節點重要性的估值,但什麼是重要性?什麼是影響力?在Degree Centrality中,所有的鄰居節點都是平等的。而在實際情況中,不同的鄰居節點可能會有不同的價值。例如我有10個好友,他們都是普通人,而如果有一個人他也有10個好友,但是他的好友都是李嘉誠巴菲特奧巴馬們,顯然,我比不上他,自慚形穢了。

為此我們建立另一種模型:給鄰居節點打分,高分的鄰居會給予我更多積極的影響,使得我的得分也升高。設xi(t)為節點it時刻的centrality評估值(得分),centrality值越高說明這個節點越重要。則

(1)

或者表示為矩陣形式

(2)

其中A為圖的鄰接矩陣。不知道鄰接矩陣?回去複習線性代數離散數學和資料結構吧……

公式(1)比較好理解。基本思想其實就是說,節點j為節點i的鄰居節點(我所說的鄰居意思就是他們有邊相連),在t-1時刻,我們對j疊加求和,意思就是統計節點i的所有鄰居節點的centrality值,然後累加,就是t時刻節點i的centrality值。這個公式對所有節點有效,如果我的鄰居們的centrality值改變了,我的值也會改變,所以這是一個不斷迭代的過程,直到最後所有節點的值在一個閾值內進行可忽略的波動,即收斂。

第二個公式x(0)是0時刻初始化時所有節點的centrality值,它是一個數組。而

不斷迭代就可以得到公式(2)了。

於是x(0)可以看作是A的特徵向量Vi的線性組合,我們可以選取合適的ci使得等式

(3)

成立。

結合(2)(3)兩個式子,我們得到

(4)

其中ki為矩陣A的特徵值,k1為特徵值中的最大值。

當k>1時, ,於是當  時, ,或者直接表示為

(5)

這就是eigenvector centrality。我們如果得到圖A的鄰接矩陣的特徵向量,那麼這個向量x就是所有節點的eigenvector centrality值。我們只需解方程(5)即可。它的一個明顯的屬性就是,xi即節點i的eigenvector centrality,與該節點所有鄰居的eigenvector centrality之和成正比。即

(6)

所以,這正解決了我們之前的問題,它將我們鄰居的重要性施加到我們自己身上。有幾種情況會使得xi的值很大,一是節點有很多鄰居,二是它有一個重要鄰居(該鄰居擁有高eigenvector centrality值),或者以上兩種情況同時存在。

同樣的問題在這裡也存在,那就是我們必須知道圖的鄰接矩陣,也就是整個網路的拓撲結構。如果網路中有100萬個節點,我們生成一個100萬×100萬的矩陣也是困難的。另外,還有可能出現下面的情況

這是一個有向圖,注意節點A,它沒有in-degree,也就是說沒有其他節點可以影響到它的centrality值。假如A的centrality值是0,那麼它對它的3個鄰居的貢獻也為0,其中最上面的那個鄰居只有A對它施加影響,於是它的centrality值也為0,最後我們一步步地推斷,會發現整個圖所有節點的centrality值都是0,也就是說圖的鄰接矩陣A=0.這不是我們預想的那樣,因為如果我們希望對網頁做PageRank,這將導致所有頁面的PageRank值都一樣,沒法做排名了。

上邊提到兩種網路模型,都有著這樣那樣的缺陷。下面我們繼續來改善建模。

3. Katz Centrality

Katz Centrality解決了之前的問題。它的原理與eigenvector centrality差不多,只是我們給每一個節點提供一個初始化的centrality值β,即對式(6)做簡單改變:

(7)

α 和 β 都是正常數。

使用矩陣表示式,我們得到:

(8)

(9)

我們只關心centrality值的相對性,也就是說不管你的centrality值是10還是100,我們只關注你的centrality值是不是大於我的centrality值,因為我們希望找到centrality值最大的前10個節點,目的是做排名。於是β可以設定為1,於是Katz Centrality表達為:

(10)

事實上α和β的比值體現了對鄰居節點centrality值的側重,如果α=0那麼所有的節點的centrality值都是β=1了,完全不受鄰居的影響了。所以說這個公式更具有普遍性,這就是數學之美。

需要注意的是α不可以太大,當   會導致 ,於是 無法收斂。所以有 .

要計算Katz centrality,就要做逆矩陣運算 ,直接計算的複雜度為O(n3)。我們可以用迭代法

(11)

4. PageRank

Katz centrality的一個缺陷就是,一個擁有高centrality值的節點會將它的高影響力傳遞給它的所有鄰居,這在實際生活中可能並不恰當。比如說Google的網頁有很高的centrality值,同時Google也連結了海量的頁面。如果Google的網頁連結到了我的網頁,那我的網頁作為一個無名小卒centrality值豈不是有可能比Google還高?我們希望Katz centrality能夠由節點的out-degree稀釋,或者說我的centrality值能平均分給我的鄰居,而不是給每個鄰居都得到我的整個centrality值。用數學語言表達為

(12)

對比公式(7)就很容易理解這裡對Katz centrality做的修改了。

對於沒有外鏈的節點(例如很多連結指向了一張圖片,但圖片是沒有out-degree指向別處的),將其 值設為1.我們將式(12)寫為矩陣形式:

(13)

其中D是對角矩陣, .同樣設β=1,上式可以變形為

(14)

這就是著名的PageRank演算法。

同樣,α的取值也是有範圍的,它應該小於AD-1最大的特徵值的倒數。對於無向圖來說,這個值是1,對於有向圖來說就不一定了。Google的搜尋引擎將α設為0.85。同樣,要執行這個演算法,我們需要知道整個圖的拓撲結構。

5. HITS演算法

PageRank演算法類似,HITS也是在網路建模和權重排名中比較經典的演算法。

有的時候我們希望把高centrality值賦予那些連結了很多重要節點的節點,例如綜述性的學術論文引用了該研究領域內的大量重要論文,於是這篇綜述也被認為很有價值。因為即使這篇論文沒有為該科研領域做出什麼突破,但它總結了已有成果,告訴大家去哪裡找做出了突出貢獻的論文。

於是我們擁有兩種節點:authorities(權威型)的節點包含了具有貢獻的原創資訊,hubs(樞紐型)節點總結了很多資訊,指向了很多authorities節點。Kleinberg是康奈爾大學一位十分牛B的年輕教授(70後年輕有為啊!),他提出了hyperlink-induced topic search (HITS)演算法來量化計算authority centrality和hubs centrality。

在HITS中對於某個節點i,xi用來表示authority centrality,yi用來表示hubs centrality。每個節點既有authority屬性又有hubs屬性。節點若有高xi值則該節點被很多其他hub節點關注,如論文被大量引用、微博有很多粉絲。節點若有高yi值則該節點指向了很多其他authority節點,例如一篇綜述論文,又例如hao123.com這樣的網址導航站點(理解百度為什麼要收購hao123了吧)。

用數學語言描述如下:

(15)

或者矩陣表示式

(16)

合併演化得到

(17)

這意味著authority centrality為AAT的特徵向量,而hubs centrality為ATA的特徵向量。有趣的是AATATA擁有相同的特徵值λ,大家可以自行證明。

繼續演化,我們對式(17)左乘一個AT,得到 ,也就是說

(18)

我們知道了x,也就可以計算得到y

6. 社交網路建模工具(Python)

最近比較忙,如果沒有需求,這個系列可能就不會再繼續寫下去了。下面用一個python程式來演示社交網路的建模分析,以實際應用作為結束吧。

假設有這樣兩個文字檔案sigcomm_author.txt和sigcomm_network.txt,檔案內容如下:

sigcomm_network.txt:

1,2 (ID_1 與 ID_2 有合作發表論文)
3,4 (ID_3 與 ID_4 有合作發表論文)
4, 216 (ID_4 與ID_216 有合作發表論文)

sigcomm_author.txt:

1: Amer El Abbadi (ID_1: name)
2: Thomas Lui (ID_2: name)

這是一個學術圈的社交網路,描述了發表論文的作者之間的一些合作關係。它一個無向圖,也就是說[ID_1, ID_2] 等同於 [ID_2, ID_1]。通過編寫程式,我們可以挖掘如下資訊:

  • n: 節點數量(有多少個作者)
  • m: 邊的數量(有多少個論文合作關係)
  • 網路中連線部的大小(節點互相連線形成網路連線部,另外還可能有孤立的一些節點)
  • clustering coefficient群聚係數
  • 網路直徑(兩兩節點間會有一條最短路徑,在所有的節點對中,最長的最短路徑有多長)
  • 節點度分佈
  • 最短路徑長度分佈
  • degree centrality
  • eigenvector centrality

NetworkX是一個用Python語言開發的圖論與複雜網路建模工具,內建了常用的圖與複雜網路分析演算法,包括我已經介紹過的degree centrality,eigenvector centrality等等。使用NetworkX可以方便的進行復雜網路資料分析、模擬建模等工作。

一般Linux都預設自帶Python執行環境,Ubuntu下只需要執行以下命令即可獲得NetworkX庫進行程式開發。

sudo apt-get install python-setuptools
sudo easy_install networkx

Windows下則需要手動安裝,具體可以參考這個安裝步驟。環境都搭建好了之後就可以對社交網路之間的關係進行分析了,檢視這個入門指南

回到上文提出的例子,在呼叫NetworkX提供的介面的基礎上,我們可以挖掘論文作者之間的關係,分析整個網路的一些屬性。示例原始碼和測試資料下載

-------------------------小結:優化後的PAGERANK演算法,可以利用測算網頁中相互連線的重要性來判斷網頁重要等級的模型,來延伸到計算社交網路中意見領袖的尋找中,當然,也可以通過這種方法推算內容型站點,如輕部落格中人們對內容互動後的“內容重要等級/內容喜愛程度”,對於遊戲而言,如果能夠發現遊戲社交中的核心領袖,甚至能夠反推出互動過程中行為的重要程度,那麼就可以幫助運營做出及時決策改進,這也是一個很好的方向。