1 前言
在复杂网络研究领域,核分解是一种重要的网络结构分析方法。它通过剥离网络中的节点来揭示网络的层次结构,特别是在理解社交网络、生物网络、信息传播等方面有着广泛应用。网络核渗流是一种基于核分解的动态网络分析过程,用于模拟网络在受到外部影响时的结构演化过程,例如疾病传播、信息扩散等现象。本博客将从概念入手,介绍核渗流的基本模型和理论,提供一个简单的实现代码,并列出相关的参考文献。
2 概念
K核分解:网络的核是通过递归移除度小于的节点后所得到的最大子图。值越大,核描述的网络核心部分越“紧凑”。
渗流理论:渗流理论研究的是在一个介质中,流体如何通过其间隙或孔隙渗透。在网络科学中,渗流理论被用来模拟例如信息、病毒等在网络中的传播过程。
3 模型
考虑一个无向图,其中是节点集,是边集。网络的核渗流可以定义为一个动态过程,其中节点的激活或失活受到邻居节点状态的影响,以及网络全局属性的控制。
动态规则:给定阈值,在每一时间步,节点若至少有个激活的邻居,则该节点保持激活状态;否则,该节点失活。
4 理论
4.1 定义
p | 节点保留的概率 |
q | 节点的度,以区分”k核渗流“中的k |
m元子树 | 在树形网络中,每个节点都具有至少m个无限大的子分支 |
R | 一条随机的边的一端不是k - 1 元子树的概率 |
M(k) | 一个节点属于k核巨分支的概率 |
4.2 公式
5 代码
在平均度的随机网络中,k 核巨分支的大小随网络中删除节点比例Q的变化。
from scipy.optimize import fsolve, root
import matplotlib.pyplot as plt
import numpy as np
from scipy.special import gamma, gammaincc
"""
k核渗流理论解的复现
"""
# 网络平均度
z1 = 10
# 计算k核巨分支的大小M(k)
M = lambda k, R, p: p * (1 - gammaincc(k, z1 * (1 - R)))
def getRe(k, p):
# 一条随机边的一端不是k-1元子树的根的概率
R = np.nan
# 最小根
t = 1
# R的自洽方程
def func(R, k, p):
return 1 - p + p * (gammaincc(k - 1, z1 * (1 - R))) - R
# 初始值
initialGuesses = [val for val in np.linspace(0, 0.8, 10)]
for initialGuess in initialGuesses:
root, data, ier, msg = fsolve(func, initialGuess, args=(k, p), full_output=True)
if ier == 1:
# 取最小的根作为R的解
if root < t:
R = root
t = root
return M(k, R, p)
# 随机移除Q比例的节点
Q = np.linspace(0, 0.8, 100)
# 保留p比例的节点
p = 1 - Q
getRe = np.vectorize(getRe)
plt.figure
for i in range(3, 8):
plt.plot(Q, getRe(i, p))
plt.legend(['k=3', 'k=4', 'k=5', 'k=6', 'k=7'])
plt.xlabel("p")
plt.ylabel("R")
plt.xlim([0, 0.8])
plt.tight_layout
# plt.savefig('./1.pdf')
plt.show()
exit()
模拟和理论结果吻合