文章目录
一、论文主体
论文题目:《Finding community structure in networks using the eigenvectors of matrices》
Leading eigenvector
这是Newman(一个学物理的大佬) (2006)提出的一种自上而下的分层社区发现算法。该算法的核心是定义了一个模块度矩阵(modularity matrix)。最大化模块度的过程可以体现在模块度矩阵的特征值分解中,模块度矩阵在社区发现中的作用类似于由图拉普拉斯算子在图划分中发挥的作用。
(1)首先计算模块度矩阵的最大正特征值所对应的特征向量,
(2)然后根据特征向量中元素的正负符号将节点分成两个社区。
如果特征向量中的所有元素都具有相同的符号,则说明该网络没有底层的社区结构。该算法的复杂度为O((m+n)n)。
基础知识回顾:
定义一(图的邻接矩阵):
- 给定一个图,其对应的邻接矩阵被记为。表示存在从结点到的边,反之表示不存在从结点到的边。
- 在无向图中,从结点到的边存在,意味着从结点到的边也存在。因而无向图的邻接矩阵是对称的。
- 在无权图中,各条边的权重被认为是等价的,即认为各条边的权重为。
- 对于有权图,其对应的邻接矩阵通常被记为,其中表示从结点到的边的权重。若边不存在时,边的权重为。
一个无向无权图的例子: - 其邻接矩阵为:
定义二(拉普拉斯矩阵,Laplacian Matrix):
- 给定一个图,其邻接矩阵为,其拉普拉斯矩阵定义为,其中度矩阵。
定义三(对称归一化的拉普拉斯矩阵,Symmetric normalized Laplacian):
- 给定一个图,其邻接矩阵为,其规范化的拉普拉斯矩阵定义为
二、复现代码
举个小栗子,给出如下的矩阵:
2.1 算法大致流程
(0)算法开头先输入对应的邻接矩阵:
(1)通过一个for循环求第i个结点对应的值:
(2)再求出P矩阵:
(3)
(4)求出B矩阵的特征值:
(5)对B矩阵对应的特征值进行大到小排序,找到最大的特征值
(6)求出(5)的 对应的特征向量
(7)利用匈牙利算法将大于0和小于0的数进行处理(好像不用匈牙利也行)
2.2 Python代码实现
用我们上面的栗子,可以得到如下的社区分解的结果如下,两个社区也是符合事实的。注意在打印数值时默认是科学记数法的,可以使用np.set_printoptions(suppress=True)
去掉。
具体方法:控制文件中小数位数
np.set_printoptions(precision=3, suppress=True)
参数:
precision
: 保留几位小数,后面不会补0
supress
: 对很大/小的数不使用科学计数法 (true)
formatter
: 强制格式化,后面会补0
三、匈牙利算法
从下面的初始矩阵(花费矩阵or利益矩阵),根据上面代码结果的[1 2 2],即选第一行的1,第二行的2,第三行的2。
Reference
(1)网络库:https://networkrepository.com/ca_netscience.php (2)关于社区发现的论文综述:《Community Detection in Networks: A Multidisciplinary Review》Muhammad Aqib Javeda,∗, Muhammad Shahzad Younisa, Siddique Latifa,b, Junaid Qadirb,Adeel Baigc
(3)《Finding community structure in networks using the eigenvectors of matrices》M. E. J. Newman
(4)http://matei.org/ithink/2009/09/12/finding-community-structure-in-networks-using-the-eigenvectors-of-matrices/ (5)社区发现算法的综述推文介绍:https://www.sohu.com/a/477299731_455817
(6)敲黑板!!github上很棒的基于深度学习的社区发现的论文汇总:https://github.com/fanzhenliu/awesome-deep-community-detection,也有用到近几年很火的GCN、GAT算法
(7)社区发现算法-百度百科介绍 (8)匈牙利算法流程以及Python程序实现 (9)基于匈牙利算法的任务分配问题的python实现