Social Network Analysis的Centrality总结,以及networkx实现EigenCentrality,PageRank和KatzCentrality的对比

本文主要总结近期学习的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.

 

posted @ 2017-08-04 00:29  选择自由  阅读(2821)  评论(0编辑  收藏  举报