一、SBM模型概述
随机块模型(Stochastic Block Model,简称SBM)是描述社交网络、互联网、生物信息的经典模型,是图论、网络科学领域内的重要研究课题之一。SBM通过将网络中的节点分为多个社区,使得社区内的节点具有相似的属性和相互作用,社区之间的节点则有不同的属性和作用。SBM模型是一种基于概率的模型,将节点按照随机分布关系划分到不同的块中,进而描述社会或物理系统的复杂性。
SBM模型的特点是对不同的社区内部和社区之间的联系赋予了不同的权重,对同一社区的节点赋予了相似特征和相互作用。SBM模型可以用于社交网络关系预测、节点聚类、异常检测等领域。
二、SBM模型参数
SBM模型有两个重要的参数p和q,分别代表社区内部和社区之间节点关系的概率。p的大小决定了社区内部节点的连边密度,q的大小则决定了社区之间连边的密度强弱。李航老师的《统计学习方法》中对SBM的定义如下:
设G=(V,E)是一个无向图,n是节点的个数,k是社区数目。 设Z是一个长度为n的节点归属社区的一维数组,其中Zi表示第i个节点所属的社区。 设Pi(k)表示社区k内部任选两个节点之间连边的概率,Q(i,j)表示社区i和社区j之间任选两个节点之间连边的概率。 那么,根据SBM模型对G进行随机生成的一种方法是: (1)对于每个社区k,任意两个节点之间连边的概率均是P(k); (2)对于每对社区i和j,社区i中任意一个节点和社区j中的任意一个节点之间连边的概率是Q(i,j); (3)对于所有的连边,我们随机地选择其方向和权重。
三、SBM模型实现
中文维基百科中SBM模型的实现代码如下,已做适当修改:
import random from numpy import * import matplotlib.pyplot as plt # 定义社区节点数量和块数量 N = 100 k = 4 # 实现随机生成节点社区的函数 def initGroup(): # 随机生成节点属于哪个块 group = [] for i in range(N): group.append(random.randint(0,k-1)) return group # 通过生成节点社区随机矩阵实现随机连边 def genRandomMat(P,Q,group): # 初始化矩阵 G = zeros([N,N]) for i in range(N): for j in range(N): # 对同一社区内的节点,连接概率设为p if group[i] == group[j]: if random.random() < P[group[i]]: G[i][j] = G[j][i] = 1 # 对不同社区的节点,连接概率设为q else: if random.random() < Q[group[i]][group[j]]: G[i][j] = G[j][i] = 1 return G # 定义主函数,生成SBM图并可视化 def main(): # 初始化社区节点数量和块数量 N = 100 k = 4 # 定义每个块内节点的连边概率 P = [0.25, 0.30, 0.27, 0.23] # 定义不同块之间节点连边概率,这里采用对称矩阵 Q = array([ [0.1, 0.3, 0.2, 0.2], [0.3, 0.1, 0.4, 0.2], [0.2, 0.4, 0.1, 0.3], [0.2, 0.2, 0.3, 0.1]]) group = initGroup() G = genRandomMat(P,Q,group) plt.imshow(G,cmap='gray') plt.show() if __name__ == "__main__": main()
四、SBM模型拓展
随机块模型在实际应用中,需要对模型进行拓展才能满足应用需求。其中一种较重要的拓展是:针对现实中社区难以等比例分配的情况,对经典SBM模型进行改进,提出了加权SBM模型,即对每个社区内节点之间的连边赋予权重,权重可以反映节点之间的交互强度。该模型可以用于计算社区内部节点的重要性和不同社区之间节点的相似度。
加权SBM模型的实现代码如下:
import random from numpy import * import matplotlib.pyplot as plt # 定义社区节点数量和块数量 N = 100 k = 4 # 实现随机生成节点社区的函数 def initGroup(): # 随机生成节点属于哪个块 group = [] for i in range(N): group.append(random.randint(0,k-1)) return group # 通过生成节点社区随机矩阵实现随机连边,并设定权重 def genRandomMat(P,Q,group): # 初始化矩阵和连边权重矩阵 G = zeros([N,N]) W = zeros([N,N]) for i in range(N): for j in range(N): # 对同一社区内的节点,连接概率设为p if group[i] == group[j]: if random.random() < P[group[i]]: G[i][j] = G[j][i] = 1 W[i][j] = W[j][i] = random.random() # 对不同社区的节点,连接概率设为q else: if random.random() < Q[group[i]][group[j]]: G[i][j] = G[j][i] = 1 W[i][j] = W[j][i] = random.random() return G,W # 定义主函数,生成SBM图并可视化 def main(): # 定义每个块内节点的连边概率和不同块之间节点连边概率 P = [0.25, 0.30, 0.27, 0.23] Q = array([ [0.1, 0.3, 0.2, 0.2], [0.3, 0.1, 0.4, 0.2], [0.2, 0.4, 0.1, 0.3], [0.2, 0.2, 0.3, 0.1]]) group = initGroup() G,W = genRandomMat(P,Q,group) plt.subplot(121) plt.imshow(G,cmap='gray') plt.title('Binary Graph') plt.subplot(122) plt.imshow(W,cmap='gray') plt.title('Weighted Graph') plt.show() if __name__ == "__main__": main()
五、SBM模型应用
SBM模型可以用于社交网络关系预测、节点聚类、异常检测等领域。其中,社区发现(Community Detection)是SBM模型具有应用前景的重要研究方向之一。社区发现是在研究复杂网络时,将网络中的节点划分为社区的过程。将同一社区内的节点聚集在一起,不同社区之间的节点聚集则较少。SBM模型中通过权重概率矩阵来描述社区之间的联系,对于社区发现、节点聚类等问题,可以利用SBM模型来实现。
此外,SBM模型可以用于异常检测。异常检测是指在数据集中检测出与正常模式不同的数据项。在SBM模型中,异常检测可以通过分析节点之间的联系,发现与社区结构不符合的节点,从而实现异常检测功能。