1. 谱聚类
在上图中,一共有6个顶点(博客),顶点之间的连线表示两个顶点的相似度,现在要将这图分成两半(两个类),要怎样分割(去掉哪边条)?根据谱聚类的思想,应该去掉的边是用虚线表示的那条。最后,剩下的两半就分别对应两个类了。
(a)建立similarity graph,并用 W 表示similarity graph的带权邻接矩阵
(b)计算unnormalized graph Laplacian matrix L(L = D - W, 其中D是degreematrix)
(c)计算L的前K个最小的特征向量
(d)把这k个特征向量排列在一起组成一个N*k的矩阵,将其中每一行看作k维空间中的一个向量,并使用 K-means算法进行聚类
2. 算法原理解析
(a)谱聚类的思想就是要转化为图分割问题。因此,第一步就是将原问题转化为图。转为图有两个问题要解决:一是两个顶点的边要怎样定义;二是要保留哪些边。
(b)unnormalized graph Laplacianmatrix(以下用L表示)有很多很好的性质,也正是这个原因,才要在第二步中计算这么一个矩阵。最重要的性质是下面这一组性质:
这一组性质将在之后的公式推导中起到决定性作用。
(c)将原问题转化为图后,接下来的工作就是决定怎样分割了。图分割问题实际上就是最小割问题(mincutproblem)。最小割问题可定义为最小化以下目标函数:
其中k表示分成k个组,Ai表示第i个组,表示第Ai的补集,W(A,B)表示第A组与第B组之间的所有边的权重之和。
其中|A|表示A组中包含的顶点数目。
其中H是一个矩阵,它的元素的定义(Eq.(5))如下:
(d)在第三步中,我们为了松驰NP难问题,让H矩阵取任意值,因此,解出来的H矩阵不再具有原来的性质——元素值能指出哪个点属于哪一类。尽管如此,对于k-means来说,将H矩阵的每一行当作一个点进行聚类还是挺轻松的。因此,用k-means对H矩阵进行聚类作为谱聚类的最终结果。
3. 谱聚类的实现
function [ C, L, D, Q, V ] = SpectralClustering(W, k) % spectral clustering algorithm % input: adjacency matrix W; number of cluster k % return: cluster indicator vectors as columns in C; unnormalized Laplacian L; degree matrix D; % eigenvectors matrix Q; eigenvalues matrix V % calculate degree matrix degs = sum(W, 2); D = sparse(1:size(W, 1), 1:size(W, 2), degs); % compute unnormalized Laplacian L = D - W; % compute the eigenvectors corresponding to the k smallest eigenvalues % diagonal matrix V is NcutL's k smallest magnitude eigenvalues % matrix Q whose columns are the corresponding eigenvectors. [Q, V] = eigs(L, k, 'SA'); % use the k-means algorithm to cluster V row-wise % C will be a n-by-1 matrix containing the cluster number for each data point C = kmeans(Q, k); % convert C to a n-by-k matrix containing the k indicator vectors as columns C = sparse(1:size(D, 1), C, 1); end
4. 相关资料
[1]A Tutorial on Spectral Clustering
[2]漫谈 Clustering 系列
转自http://www.cnblogs.com/FengYan/archive/2012/06/21/2553999.html