2021.8.26

一、复杂网络中心度

中心度(Centrality):衡量节点重要程度
游走(walk):可以多次经过同一个节点的路径,根据所考虑的游走类型和统计它们的方式,中心度度量也会各有不同。

(一)PageRank 算法

PageRank 是根据所连接的相邻节点,然后再根据它们各自的相邻节点估计当前节点的重要性。(有向图

  • 计算方法1:通过在相邻节点上迭代地分配节点的秩(原本基于度)
  • 计算方法2:通过随机遍历图并统计每次游走期间到达每个节点的频率
nx.pagerank(G_karate, alpha=0.9) 

(二)度中心度(Degree Centrality)

c_degree = nx.degree_centrality(G_karate)
c_degree = list(c_degree.values())
#计算度中心度
print("Degree centrality")
d = nx.degree_centrality(G)
for v in G.nodes():
    print(v, d[v])

(三)接近度中心度(Closeness Centrality)

c_closeness = nx.closeness_centrality(G_karate)
c_closeness = list(c_closeness.values())
#计算紧密中心度
print("Closeness centrality")
c = nx.closeness_centrality(G)
for v in G.nodes():
    print(v, c[v])

(四)中间中心度(Betweenness Centrality)

引用算法

c_betweenness = nx.betweenness_centrality(G_karate)
c_betweenness = list(c_betweenness.values())

按节点输出

#计算中介中心度
print("Betweenness centrality")
b = nx.betweenness_centrality(G)
for v in G.nodes():
    #print("%s %0.6r" % (v, b[v])) 
    # %s字符串,%0.6r浮点数子6print(v, b[v])

(五)特征向量中心度(Eigenvector Centrality)

c_eigenvector = nx.eigenvector_centrality(G)
c_eigenvector = list(c_eigenvector.values())
#计算特征向量中心度
print("Eigenvector Centrality")
Ei = nx.eigenvector_centrality(G)
for v in G.nodes():
    #print("%s %0.6r" % (v, b[v])) 
    # %s字符串,%0.6r浮点数子6print(v,Ei[v])

二、总体代码

(一)对比

利用中间中心性画出网络图,并且区分颜色。

import networkx as nx
import matplotlib.pyplot as plt



column1 = []
with open('node-9.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        column1.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(column1)

edge = []
with open('edge-9.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        edge.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(edge)

G = nx.DiGraph()
G.add_nodes_from(column1)
G.add_weighted_edges_from(edge)
 
 
#nx.draw_networkx(G,pos=nx.shell_layout(G),node_size=20,node_shape='o',width=1,style='solid',font_size=8) 


#plt.figure(figsize=(12,8))
#print ( G.nodes())
###中心度计算
#中间中心度(Betweenness Centrality)
c_betweenness = nx.betweenness_centrality(G)
c_betweenness = list(c_betweenness.values())
print(c_betweenness)

#计算中介中心度
print("Betweenness centrality")
b = nx.betweenness_centrality(G)
for v in G.nodes():
    #print("%s %0.6r" % (v, b[v])) 
    # %s字符串,%0.6r浮点数子6print(v, b[v])


pos = nx.spring_layout(G)
plt.figure(figsize=(10, 10))# Degree Centrality
nx.draw(G, cmap = plt.get_cmap('inferno'), node_color = c_betweenness, node_size=300, pos=pos, with_labels=True)

输出结果图:
在这里插入图片描述

计算中间中心度指标对比:在这里插入图片描述
可以发现第二种代码可以直接导出表格中使用。

(二)完整代码

在这里插入图片描述

import networkx as nx
import matplotlib.pyplot as plt

column1 = []
with open('node-9.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        column1.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(column1)

edge = []
with open('edge-9.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        edge.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(edge)

G = nx.DiGraph()
G.add_nodes_from(column1)
G.add_weighted_edges_from(edge)
 
 
#nx.draw_networkx(G,pos=nx.shell_layout(G),node_size=20,node_shape='o',width=1,style='solid',font_size=8) 


#plt.figure(figsize=(12,8))
#print ( G.nodes())
###中心度计算

#度中心度(Degree Centrality)
c_degree = nx.degree_centrality(G)
c_degree = list(c_degree.values())

#特征向量中心度(Eigenvector Centrality)
c_eigenvector = nx.eigenvector_centrality(G)
c_eigenvector = list(c_eigenvector.values())

#接近度中心度(Closeness Centrality)
c_closeness = nx.closeness_centrality(G)
c_closeness = list(c_closeness.values())

#中间中心度(Betweenness Centrality)
c_betweenness = nx.betweenness_centrality(G)
c_betweenness = list(c_betweenness.values())
print(c_betweenness)

#计算中介中心度
print("Betweenness centrality")
b = nx.betweenness_centrality(G)
for v in G.nodes():
    #print("%s %0.6r" % (v, b[v])) 
    # %s字符串,%0.6r浮点数子6print(v, b[v])


pos = nx.spring_layout(G)
plt.figure(figsize=(18, 12))# Degree Centrality
f, axarr = plt.subplots(2, 2, num=1)
plt.sca(axarr[0,0])
nx.draw(G, cmap = plt.get_cmap('inferno'), node_color = c_degree, node_size=300, pos=pos, with_labels=True)
axarr[0,0].set_title('Degree Centrality', size=16)# Eigenvalue Centrality
plt.sca(axarr[0,1])
nx.draw(G, cmap = plt.get_cmap('inferno'), node_color = c_eigenvector, node_size=300, pos=pos, with_labels=True)
axarr[0,1].set_title('Eigenvalue Centrality', size=16)# Proximity Centrality
plt.sca(axarr[1,0])
nx.draw(G, cmap = plt.get_cmap('inferno'), node_color = c_closeness, node_size=300, pos=pos, with_labels=True)
axarr[1,0].set_title('Proximity Centrality', size=16)# Betweenness Centrality
plt.sca(axarr[1,1])
nx.draw(G, cmap = plt.get_cmap('inferno'), node_color = c_betweenness, node_size=300, pos=pos, with_labels=True)
axarr[1,1].set_title('Betweenness Centrality', size=16)

三、总结

  • 使用中心性算法画图(node_color = c_betweenness),同时能够导出excel
c_betweenness = nx.betweenness_centrality(G)
c_betweenness = list(c_betweenness.values())
nx.draw(G, cmap = plt.get_cmap('inferno'), node_color = c_betweenness, node_size=300, pos=pos, with_labels=True)
  • 利用中心性算法计算指标,并且可以导出数据使用。
#计算中介中心度
print("Betweenness centrality")
b = nx.betweenness_centrality(G)
for v in G.nodes():
    #print("%s %0.6r" % (v, b[v])) 
    # %s字符串,%0.6r浮点数子6位
    print(v, b[v])

参考链接:社会网络分析——三、图论与图学习

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐