这个问题的来由参见《社区发现之谱聚类算法手撕举例》
例:下图中7个点被分到了3个社区
-
邻接矩阵
A = [ 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 ] A = \left[ \begin{matrix} 0 & 1 & 0 & 0 & 0 & 0 & 0\\ 1 & 0 & 1 & 0 & 0 & 0 & 0\\ 0 & 1 & 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 1 & 0 & 1 & 0\\ 0 & 0 & 0 & 0 & 1 & 0 & 1\\ 0 & 0 & 0 & 0 & 0 & 1 & 0\\ \end{matrix} \right] A=⎣ ⎡0100000101000001010000010100000101000001010000010⎦ ⎤ -
社区关系矩阵:
-
X T A X {X^TAX} XTAX
X X X可以看作是结点分组器, X T A X {X^TAX} XTAX就是对组内结点的求和,即对 A A A中三个区域内部元素求和
形成3*3矩阵:
X T A X = [ 2 . . . . . . . . . 4 . . . . . . . . . 2 ] {X^TAX} = \left[ \begin{matrix} 2 & ... & ...\\ ... & 4 & ...\\ ... &... & 2\\ \end{matrix} \right] XTAX=⎣ ⎡2.........4.........2⎦ ⎤
对角线上的数值分别是三个社区中结点内部度的总和。 -
拉普拉斯算子 L L L
对角度矩阵 D=diag[1,2,2,2,2,2,1]
类似上文对 A A A的运算,
X T D X = [ 3 . . . . . . . . . 6 . . . . . . . . . 3 ] {X^TDX} = \left[ \begin{matrix} 3 & ... & ...\\ ... & 6 & ...\\ ... &... & 3\\ \end{matrix} \right] XTDX=⎣ ⎡3.........6.........3⎦ ⎤
对角线上的数值分别是三个社区中结点全部度的总和。(D为对角度矩阵)
所以 L = X T ( D − A ) X L=X^T(D-A)X L=XT(D−A)X代表全部度减去内部度,也就是割的大小。
L = [ 3 . . . . . . . . . 6 . . . . . . . . . 3 ] − [ 2 . . . . . . . . . 4 . . . . . . . . . 2 ] = [ 1 . . . . . . . . . 2 . . . . . . . . . 1 ] L = \left[ \begin{matrix} 3 & ... & ...\\ ... & 6 & ...\\ ... &... & 3\\ \end{matrix} \right]-\left[ \begin{matrix} 2 & ... & ...\\ ... & 4 & ...\\ ... &... & 2\\ \end{matrix} \right]= \left[ \begin{matrix} 1 & ... & ...\\ ... & 2 & ...\\ ... &... & 1\\ \end{matrix} \right] L=⎣ ⎡3.........6.........3⎦ ⎤−⎣ ⎡2.........4.........2⎦ ⎤=⎣ ⎡1.........2.........1⎦ ⎤
对角线分别是三个社区的割的大小{1,2,1},与实际图中展示的一致。
我们的目标就是让所有社区的割之和最小(按比例或归一化后)。
总结
拉普拉斯算子就是割的大小。