EAGLE是一种基于最大团聚类的层次聚类算法,用来揭示网络的层次化和层次化社区结构。该算法采用一种聚类框架,来处理最大派系。
1.算法的实现:
首先用Bron-Kerbosch算法找到网络中的最大派系,要设置一个阈值k来丢弃所有小于K的最大派系,通常k取3-6之间的值。算法分为两个阶段:第一阶段生成树状图;第二阶段选着合适的切割点,将树状图分成群落。
第一阶段:
(1)找出网络中的最大派系,忽略最大的子派系,其余作为初始社区
(2)选择相似度最大的一对群落,将其合并到新的群落中,计算新群落与其他群落的相似度
(3)重复步骤(2)直到只剩一个社区
社区c1与c2相似度M:(Avw是网络邻接矩阵的元素(点v,w间有边为1,无边为0),kv是点v的度。)
第二阶段:计算EQ,选取EQ最大值为切割点,对树状图进行切割,EQ公式:(其中Ov是顶点v所属的社区数)
2.论文中的数据集保存为eagle.txt(数据集在下方4中给出),注意:下标从1开始的数据集用此段代码
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
#存储社区合并时产生的二叉树
class Dendrogram:
def __init__(self,root):
self.data = root
self.left = None
self.right = None
def insertL(self,data): #由于树是从下向上生成所以插入左右孩节点的函数没有用到
if self.left == None:
self.left = Dendrogram(data)
elif self.right == None:
self.right = Dendrogram(data)
else:
self.insert(self.left,data)
def insertR(self,data): #没有用到
if self.left == None:
self.left = Dendrogram(data)
elif self.right == None:
self.right = Dendrogram(data)
else:
self.insert(self.right,data)
def printT(self): #递归线序遍历整棵社区树
print("输出根")
print(self.data)
if self.left != None:
print("输出左")
self.left.printT()
if self.right != None:
print("输出右")
self.right.printT()
# def getR(self):
# return self.right
# def getL(self):
# return self.left
# def getR(self):
# return root
# def setR(self,data):
# self.data = data
#eagle算法的实现
class ELAGE():
def __init__(self,G):
self.G = G #用于存放图
self.admatrix = np.array(nx.adjacency_matrix(G).todense())#存放图的邻接矩阵
# print(self.admatrix)
m=0 #计算图的总边数(因为是无向图,多计算了一遍)
for i in self.admatrix:
for j in i:
if j == 1:m=m+1
m = m/2
self.m = m #存放图的边数
# print(self.m)
# self.dendrogram = None #存放树形图(当作指针的话会把两个没有连接的树丢失,只能使用列表先保存)
self.dendrogram = [] #存放合并过程中产生的树形图,合并时与存放派系的列表p相结合
self.maxEq = {-1:[0]} #字典的键放EQ的最大值,字典的值存放产生EQ最大值时社区的状态
self.surface = []
def get_vd(self,v): #获取节点v的度
d = 0
for i in self.admatrix[v]:
d = d+i
return d
def finess(self,c1,c2): #相似度M函数
M = 0
for i in c1:
for j in c2:
# print(self.get_vd(i-1),self.get_vd(j-1),self.get_vd(i-1)*self.get_vd(j-1)/(2*self.m))
i