1. 程式人生 > >Social Network Analysis的Centrality總結,以及networkx實現EigenCentrality,PageRank和KatzCentrality的對比

Social Network Analysis的Centrality總結,以及networkx實現EigenCentrality,PageRank和KatzCentrality的對比

節點 int nod pos rect arc 分享 http import

本文主要總結近期學習的Social Network Analysis(SNA)中的各種Centrality度量,我暫且翻譯為中心度。本文主要是實戰,理論方面幾乎沒有,因為對於龐大的SNA,我可能連門都沒有入,但是我覺得這不影響我理解原理後使用他們。

本文為原創,如有不小心侵權的問題出現,請聯系本人刪除。本文不允許任何形式的轉載!!!

一、Centrality的定義

在SNA領域的centrality是用於衡量圖中節點的重要度,不同的centrlity算法會對同一節點給出差異很大的centrality。如Wikipedia中的這幅圖。

技術分享

圖片鏈接:https://en.wikipedia.org/wiki/Centrality

二、Centrality的相關資源

1. wiki: https://en.wikipedia.org/wiki/Centrality

2. ttang pageRank networkx: http://www.cnblogs.com/fstang/archive/2013/06/01/3113352.html

3. 講network的一個網站:https://www.sci.unich.it/~francesc/teaching/network/

4. 各種語言的centrality代碼資源集合: http://www.centiserver.org/?q1=software

三、Networkx中的EigenCentrality, PageRank和KatzCentrality的對比

本文主要考察的是EigenCentrality, PageRank和KatzCentrality之間的區別和聯系。PageRank廣為人知,是Google對網頁排序的基礎方法之一。其實Google的PageRank和KatzCentrality都是EigenCentrality的變形。

EigenCentrality的基本思想跟google是一樣的,都是認為與得分(centrality)高的點相連的點更加重要。EigenCentrality就是用圖的鄰接矩陣來計算EigenCentrality(engenvector centrality, 特征向量中心度)。具體的公式和推到可以參考上面給出的維基百科鏈接,代碼實現可以參考networkx,還有https://www.sci.unich.it/~francesc/teaching/network/,但是我打開頁面,裏面的公式顯示有問題,這個網站的解釋非常的簡潔明了,適合入門,還有R代碼和相應的圖演示。

參考ttang的博客,我做了EigenCentrality, PageRank和KatzCentrality的對比,在此表示由衷的感謝。ttang的pageRank實現代碼參考鏈接:

http://www.cnblogs.com/fstang/archive/2013/06/01/3113352.html

下面是本文的代碼實現:

 1 import matplotlib.pyplot as plt
 2 import networkx as nx
 3 
 4 G=nx.binomial_graph(10, 0.3, directed=True) #the graph
 5 G.add_node(10); # add a sole node
 6 layout = nx.spring_layout(G)
 7 
 8 plt.figure("source graph")
 9 nx.draw(G, pos=layout, node_color=y)
10 
11 plt.figure("eigenCentrality without personalization")
12 pr=nx.eigenvector_centrality(G)
13 print("eigenCentrality without personalization" ,pr)
14 nx.draw(G, pos=layout, node_size=[x * 6000 for x in pr.values()],node_color=m,with_labels=True)
15 
16 plt.figure("eigenCentrality with personalization")
17 pr=nx.eigenvector_centrality(G, nstart={0:1, 1:1, 2:10, 3:1, 4:1, 5:1, 6:1, 7:1, 8:1, 9:1, 10:1})
18 print("eigenCentrality with personalization" ,pr)
19 nx.draw(G, pos=layout, node_size=[x * 6000 for x in pr.values()],node_color=m,with_labels=True)
20 
21 plt.figure("pageRank without personalization")
22 pr=nx.pagerank(G,alpha=0.85)
23 print("pageRank without personallization", pr)
24 nx.draw(G, pos=layout, node_size=[x * 6000 for x in pr.values()],node_color=m,with_labels=True)
25 
26 plt.figure("pageRank with personalization ")
27 pr=nx.pagerank(G,alpha=0.85, personalization={0:1, 1:1, 2:10, 3:1, 4:1, 5:1, 6:1, 7:1, 8:1, 9:1, 10:1})
28 print("pageRank with personalization" , pr)
29 nx.draw(G, pos=layout, node_size=[x * 6000 for x in pr.values()],node_color=m,with_labels=True)
30 
31 plt.figure("katzcentrality without personalization")
32 pr=nx.katz_centrality(G, alpha=0.3);
33 print("katzcentrality without personallization ", pr)
34 nx.draw(G, pos=layout, node_size=[x * 6000 for x in pr.values()],node_color=m,with_labels=True)
35 
36 plt.figure("katzcentrality with personalization")
37 pr=nx.katz_centrality(G,alpha=0.3, nstart={0:1, 1:1, 2:10, 3:1, 4:1, 5:1, 6:1, 7:1, 8:1, 9:1, 10:1})
38 print("katzcentrality with personalization" , pr)
39 nx.draw(G, pos=layout, node_size=[x * 6000 for x in pr.values()],node_color=m,with_labels=True)
40 plt.show()

這是畫出來的圖,自己跑一下看得清楚寫,這裏貼出來的圖只是示意。

技術分享

最左邊一列是pageRank有無personalization,也就是節點預先設定的重要度的對比情況;

中間一列是eigenCentrality有無personalization的對比;

右邊一列是katzCentrality有無personalization的對比。

上次我看這個圖的時候,覺得節點預設重要度對pageRank算法的影響很小,對katzCentrality的影響比較大,不過今天看,感覺好像都差不多。

由於節點10沒有邊與其它節點相連,有沒有pageRank的轉移概率,有沒有katzCentrality的beta,因此節點10在eigenCentrality裏centrality為0.

Social Network Analysis的Centrality總結,以及networkx實現EigenCentrality,PageRank和KatzCentrality的對比