本文结构安排
-
图聚类简介
-
正则化割
-
Louvain
-
非负矩阵分解(NMF)
-
其他常见方法
-
图(graph):是一种由点和边集构成的结构 G = ( V , E ) G=(V,E) G=(V,E)
-
图聚类(graph clustering) : 将点划分为不同的簇,使得簇内的边尽量多,簇之间的边尽量少。也称为图划分(partitioning),社区检查(community detection)
应用Louvain算法产生的社区检测图示
Normalized cut
正则化割的基本原理是使各簇之间的割最小,但不是算其最小割,因为这会使相对孤立的边缘点“自成一团”,造成社区大小的不均衡。算法的基本过程的前半部分类似于谱聚类,先由度矩阵和邻接矩阵,计算出拉普拉斯矩阵,得到第二小到K+1小的特征向量,对其进行K-means聚类,预处理得到k’个簇。之后,计算两两簇合并之后,计算其正则化割,选择正则化割最小的两个簇合并。每次合并减小一个簇,直到减小到K个簇。
k-路划分:
(1)计算相似度矩阵W和度矩阵D
(2)计算标准化拉普拉斯矩阵 D − 1 2 ( D − W ) D − 1 2 D^{-\frac{1}{2}}(D−W)D^{-\frac{1}{2}} D−21(D−W)D−21
(3)从第二小的特征值开始找 k ’ k’ k’个最小的特征值对应的特征向量构造 n ⋅ k ′ n \cdot k′ n⋅k′维度的特征矩阵F
(4)对特征矩阵F按行进行标准化后,进行Kmeans聚类得到 k ’ k’ k’簇
(5)在这 k ’ k’ k’个簇中,每次选取两个簇进行合并,直到最后剩下k个簇,选取的策略是最小化Ncut时的合并组合
Louvain
Louvain算法的基本原理也是采用合并的策略,但是它合并的标准是模块度增益。首先将每个节点初始化为不同社区,计算将节点加入其邻居社区的模块度增益△Q,选择使模块度增益最大的邻居进行合并,合并后的社区看做一个新的节点,直到两两社区合并的模块度增益都不大于0,则停止合并。
Louvain算法步骤如下:
(1)初始化每个数据点为一个社区;
(2)对每个数据点,尝试加入其邻居所在的社区,计算比较加入前后的模块度增益ΔQ,选出增益最大的那个邻居社区,若其对应的增益ΔQ>0,则该数据点加入这个社区,否则不改变其原来社区划分;
(3)将得到的社区视为一个节点,社区内节点之间边权重转化为新节点环的权重,社区间的边权重转化为新节点间的边权重;
(4)重复(2)(3)步骤,直至满足收敛条件。
收敛条件可以是迭代了一定的次数,亦或是模块度不再增加。