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浮点数子6位
print(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浮点数子6位
print(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浮点数子6位
print(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浮点数子6位
print(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])
参考链接:社会网络分析——三、图论与图学习