谱聚类概述
谱聚类的主要思想是将数据点视为图中的节点,节点之间的连接权重反映数据点之间的相似度。通过图论和线性代数的方法,将图分割成多个子图,使得子图内部的连接权重之和最大化,而子图之间的连接权重之和最小化,从而达到聚类的目的。
谱聚类基础之一:无向权重图
用于表示数据点之间的相似性。具体而言,无向权重图是一种图论中的图形结构,其中的边没有方向且每条边都具有相应的权重。
对于一个图G,我们一般用点的集合V和边的集合E来描述。即为G(V,E)。其中V即为我们数据集里面所有的点(v1,v2,...vn)。对于V中的任意两个点,可以有边连接,也可以没有边连接。我们定义权重Wij为点Vi和点Vj之间的权重。由于我们是无向图,所以Wij=Wji。
对于有边连接的两个点Vi和Vj,Wij>0,对于没有边连接的两个点Vi和Vj,Wij=0。对于图中的任意一个点Vi,它的度Di定义为和它相连的所有边的权重之和,即
谱聚类基础之二:相似矩阵
邻接矩阵W,它是由任意两点之间的权重值Wij组成的矩阵。
基本思想是,距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,不过这仅仅是定性,我们需要定量的权重值。一般来说,我们可以通过样本点距离度量的相似矩阵S来获得邻接矩阵W。
构建邻接矩阵W的方法有三类。ϵ-邻近法,K邻近法和全连接法。
1.ϵ-邻近法
选择一个合适的ε值(距离阈值)是关键,然后用欧式距离sij度量任意两点Xi和Xj的距离。
对于每一对数据点(i, j),检查它们之间的距离是否小于或等于ε。如果是,则在邻接矩阵中对应的位置W[i][j]设置为ε(或者该点对的相似度)。如果距离大于ε,则保持W[i][j]为0(或较低的权重值)。
2.K邻近法
在谱聚类中,KNN用于构建邻接矩阵W,该矩阵表示数据点之间的相似度。
选择k值然后每一个数据点i计算它与其他数据点之间的距离,根据计算出的距离找到其最近的K个邻居对于任意两个数据点i和j,如果他们互为K个最近邻居之一,则在邻接矩阵中的对应位置W{ij}赋值为1(或他们之间距离的倒数,取决于具体实现),否则为0。
3.全连接法
第三种定义邻接矩阵W的方法是全连接法,相比前两种方法,第三种方法所有的点之间的权重值都大于0,因此称之为全连接法。可以选择不同的核函数来定义边权重,常用的有多项式核函数,高斯核函数和Sigmoid核函数。最常用的是高斯核函数RBF,此时相似矩阵和邻接矩阵相同:
在实际的应用中,使用第三种全连接法来建立邻接矩阵是最普遍的,而在全连接法中使用高斯径向核RBF是最普遍的。
谱聚类基础之三:拉普拉斯矩阵
拉普拉斯矩阵(Laplacian matrix),也称为基尔霍夫矩阵, 是表示图的一种矩阵。给定一个有n个顶点的图G=(V,E),其拉普拉斯矩阵定义为:L=D−W。
D即为我们第二节讲的度矩阵,它是一个对角矩阵。而W即为我们第二节讲的邻接矩阵,它可以由我们第三节的方法构建出。
拉普拉斯矩阵有一些很好的性质如下:
1)拉普拉斯矩阵是对称矩阵,这可以由D和W都是对称矩阵而得。
2)由于拉普拉斯矩阵是对称矩阵,则它的所有的特征值都是实数。
3)对于任意的向量f我们有
4) 拉普拉斯矩阵是半正定的,且对应的n个实数特征值都大于等于0,即0=λ1≤λ2≤...≤λn, 且最小的特征值为0,这个由性质3很容易得出
谱聚类基础之四:无向图切图
谱聚类算法流程
SpectralClustering重要参数
1)n_clusters:代表我们在对谱聚类切图时降维到的维数(原理篇第7节的k1k1),同时也是最后一步聚类算法聚类到的维数(原理篇第7节的k2k2)。也就是说scikit-learn中的谱聚类对这两个参数统一到了一起。简化了调参的参数个数。虽然这个值是可选的,但是一般还是推荐调参选择最优参数。
2) affinity: 也就是我们的相似矩阵的建立方式。可以选择的方式有三类,第一类是 'nearest_neighbors'即K邻近法。第二类是'precomputed'即自定义相似矩阵。选择自定义相似矩阵时,需要自己调用set_params来自己设置相似矩阵。第三类是全连接法,可以使用各种核函数来定义相似矩阵,还可以自定义核函数。最常用的是内置高斯核函数'rbf'。其他比较流行的核函数有‘linear’即线性核函数, ‘poly’即多项式核函数, ‘sigmoid’即sigmoid核函数。如果选择了这些核函数, 对应的核函数参数在后面有单独的参数需要调。一般来说,相似矩阵推荐使用默认的高斯核函数。
3)kernel_params:如果affinity参数使用了自定义的核函数,则需要通过这个参数传入核函数的参数。
4 ) n_neighbors: 如果我们affinity参数指定为'nearest_neighbors'即K邻近法,则我们可以通过这个参数指定KNN算法的K的个数。默认是10.我们需要根据样本的分布对这个参数进行调参。如果我们affinity不使用'nearest_neighbors',则无需理会这个参数。
5)eigen_solver:1在降维计算特征值特征向量的时候,使用的工具。有 None, ‘arpack’, ‘lobpcg’, 和‘amg’4种选择。如果我们的样本数不是特别大,无需理会这个参数,使用''None暴力矩阵特征分解即可,如果样本量太大,则需要使用后面的一些矩阵工具来加速矩阵特征分解。它对算法的聚类效果无影响。
6)eigen_tol:如果eigen_solver使用了arpack’,则需要通过eigen_tol指定矩阵分解停止条件。
7)assign_labels:即最后的聚类方法的选择,有K-Means算法和 discretize算法两种算法可以选择。一般来说,默认的K-Means算法聚类效果更好。但是由于K-Means算法结果受初始值选择的影响,可能每次都不同,如果我们需要算法结果可以重现,则可以使用discretize。
8)n_init:即使用K-Means时用不同的初始值组合跑K-Means聚类的次数,这个和K-Means类里面n_init的意义完全相同,默认是10,一般使用默认值就可以。如果你的n_clusters值较大,则可以适当增大这个值。
9)核函数参数degree:如果我们在affinity参数使用了多项式核函数 'poly',那么我们就需要对这个参数进行调参。这个参数对应K(x,z)=(γx∙z+r)d中的d。默认是3。一般需要通过交叉验证选择一组合适的γ,r,d.
10)核函数参数coef0: 如果我们在affinity参数使用了多项式核函数 'poly',或者sigmoid核函数,那么我们就需要对这个参数进行调参。
总结:
谱聚类算法的主要优点有:
1)谱聚类只需要数据之间的相似度矩阵,因此对于处理稀疏数据的聚类很有效。这点传统聚类算法比如K-Means很难做到
2)由于使用了降维,因此在处理高维数据聚类时的复杂度比传统聚类算法好。
谱聚类算法的主要缺点有:
1)如果最终聚类的维度非常高,则由于降维的幅度不够,谱聚类的运行速度和最后的聚类效果均不好。
2) 聚类效果依赖于相似矩阵,不同的相似矩阵得到的最终聚类效果可能很不同。