社交网络算法-分析指标
- 一个具体的网络可抽象为一个由节点(vertex或node) 集合V和边(edge)集合E组成的图G = (V, E),节点数 记为n = |V|,边数记为m = |E|。
- 衡量指标
- 度(degree)
- 密度(density)
- 团(clique)
- 度中心性(degree centrality)
- 紧密中心性(closeness centrality)
- 介数中心性(betweenness centrality)
- 聚集系数(clustering coefficient)
度
import csv
edges = []
with open('net.data', 'rb') as f:
for row in csv.reader(f.read().splitlines()):
u, v = [ i for i in row]
edges.append((u, v))
from igraph import Graph as igraph
g = IGraph.TupleList(edges, directed = False, vertex_name_attr = 'name', edge_attrs = None,wwights = False)
print(g)
for p in g.vs:
print(p['name'],p.degree())
紧密中心性(closeness centrality)
某个节点到达其他节点的难易程度,也就是其他所有结点距离的平均值的倒数
paths = g.get_all_shortest_paths("7")
names = g.vs("name")
cc = 0
for p in paths:
print([names[x] for x in p])
cc += len(p)-1
print("closeness centrality", (len(paths)-1)/float(cc))
ccvs = []
for p in zip(g.vs, g.closeness()):
ccvs.append({"name":p[0]["name"],"cc":p[1]})
# print(pgvs)
sorted(ccvs, key=lambda k: k['cc'], reverse=True)[:10]
介数中心性(betweenness centrality)
计算每对节点(i,j)之间的最短路径,当然需要得到具体路径
对哥哥节点判断该节点是否在最短路径上
最后将刚刚的判断进行累加得到从i到j的最短路径经过该节点的数量
点介数
sp = []
target = 7
for v in g.vs:
print(v,v['name'])
paths = g.get_all_shortest_paths(v["name"])
for p in paths:
if target in p and target != p[0] and target != p[-1]:
print(target, p)
sp.append(p)
print(sp)
print(len(sp))
# 去重:i到j和j到i的同一条路径
spbt = ()
tu = []
for x in sp:
if set((x[0],x[-1])) not in tu:
tu.append(set((x[0],x[-1])))
spbt +=1
print("betweenness = ", spbt)
btvs = []
for p in zip(g.vs, g.betweenness()):
btvs.append({"name":p[0]["name"],"bt":p[1]})
# print(pgvs)
sorted(btvs, key=lambda k: k["bt"], reverse = True)
更多内容第一时间了解欢迎关注微信公众号 【码龙社】