1 根据数据构造一个graph, graph的每个节点对应一个数据点, 边的权重表示数据之间的相似度, 0表示完全不相似(通常为减少计算量, 将相似度低于阀值r的都记为0)。 graph用邻接矩阵的形式表示出来, 记为W.
2 把W的每一列元素加起来得到N个数,把他们放在对角上形成一个N * N矩阵, 记为D, D的其他元素都是0。 并令 L = D - W
3 求出L的前k个特征值及其对应的特征列向量
4 将这k个特征列向量排列在一起组成一个N * k的矩阵, 将每一行看做是一个k维空间中的向量, 然后对这N个k维向量进行聚类。
聚类的结果就是最终graph中的点的类别。
cut(A, B) = sigma(i in A, j in B) wij
RatioCut(A, B) = cut(A, B)/|A| + cut(A, B)/|B|
NCut(A, B) = cut(A, B)/vol(A) + cut(A,B)/vol(B), NCut 是normalized cut, vol(A)表示A中的边之和
两者都可以算作 A 的“大小”的一种度量,通过在分母上放置这样的项,就可以有效地防止孤立点的情况出现,达到相对平均一些的分割。
partition调用bestCut对W进行划分,直到cut > alpha_cut为止。
bestCut的计算使用了本文最开头的步骤(有一些不一样。。), W, D, L=D-W,计算特征值和特征向量。。
还需要理解。。