# Bottom-up core decomposition
G'=G
current=0
while G'中还有node时:
while true:
删除掉所有G'中neighbour数小于current的node
if 没删除任何node:
break
for G'中现存的每个node:
更新G中的psi(v)=current
current++
初始的psiest=degree=neighbour数量
for(v in node and node.psiest in range(ki,ke)):
# 这里的Z(v)其实就是那些与v相邻,但是不算进core number的node,因为早已经被删掉了
Z(v)=和v相邻的node u,且psiest(u)<psiest(v)
# 确认当前psiest是比实际值更高的
if |N(v)|-|Z(v)|<psiest(v),则:
for Z(v)中的每个Node(u),按照psiest排序,从小到大,序号i从0开始:
f=max(|N(v)|-(i+1),psiest(u))
if f<psiest(v):
psiest(v)=f
for G中的所有node(v):
p(v)=0 //deposit
psiest(v)=v的neighbour数
k_e=degree_max (degree指邻居数量)
k_i=max(k_min,k_e-step)
while true:
先用2里的方法算出所有node的psiest
V'=G中的psiest在k_i到k_e之间的node(包括ki ke)
if |V'|>=k_i:
E'=V' 在G中对应的所有edge
G'=(V',E'), 并且复制p(v)的值
使用1中更改后的方法计算出G'中每个node的psi, 使用ki作为下限
for V'中的所有node(v):
if 这个node(v)的psi算过了:
for v的所有neighbour(u):
p(u)=p(u)+1
else:
# 如果没assign就只能证明这些node的psi比当前的区间更小(因为第一步就被删掉的node是不会assign psi的)
psiest(v)=k_i-1
# 更新ke和ki
k_e=k_i-1
k_i=max(k_min,k_E-step)
if ke-ki<0:
break
modified bottom up
G'=G
current=ki
while G'中还有node时:
while true:
删除掉所有G'中(neighbour数+p(v))小于current的node
if 没删除任何node:
break
for G'中现存的每个node:
更新G中的psi(v)=current
current++
eigenvector centrality
for G_c中所有的node(v):
v的centrality,也即x(v)=1/G_c中node的数量
Normalize(G_c)
for i in rang(1,max):
for G_c中所有node:
记录当前的x(v),存到xlast(v)中
for G_c中所有node(v):
for v的所有neighbour(v'):
# 更新x(v')的值
x(v')+=xlast(v)
Normalize(G_c)
e=0
for G_c中所有node(v):
e=e+|x(v)-xlast(v)|
if e<V_c的数量*error tolerance:
break
Normalize(其实就是L2 norm,让x(v)的l2距离之和等于1)
s=0
for G中所有node(v):
s=s+x(v)^2
for G中所有node(v):
x(v)=x(v)/sqrt(s)
除了计算centrality,我们还可以用SIR模型来计算node对周边的影响有多大。在SIR模型中,每个node都属于以下的其中一个状态S(susceptible-可以被感染的),I(infected-被感染的),R(recovered-恢复了的),I node可以按照感染率beta感染S node,然后自己会恢复成R node.
伪代码:
基本思路就是定一个node是I,其他的都是S,然后让I去感染别人,一直到没有node是I了的时候就停下,计算平均每轮感染的人数
f(v)=0
for i in range(1,r+1):
for G中除了v的所有node(v'):
s(v')设为S #可以被感染的
s(v)设为I #已被感染的
f'=0
step=0
while G中还有状态为I的node时:
cnt=0
for V中所有node(v')
if v'是I node:
就把v'变化为R node
for v'的所有neighbour v''(可重复):
if v''状态是S,且随机数小于beta:
v''变为I
cnt++
f'=f'+cnt
step=step+1
f(v)+=(f'/step)
f(v)=f(v)/r
这里的beta一般来说用的都是1/最大的eigen value。