(python代码+讲解)重叠社区发现EAGLE层次算法的实现

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
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

篮砂石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值