谱聚类算法简单理解

article/2025/10/9 0:07:47

一、算法思想

谱聚类是基于图论的知识所演化出的算法,在聚类中广泛使用。主要思想是将所有的数据看成空间中的点,这些点之间可以用边连接起来,距离较远的两点之间边的权重值较低,距离较近的两点间边的权重值较高,然后通过对所有数据点组成的图进行切图,让切图后不同子图间边的权重之和尽可能低,子图内边的权重之和尽可能高,从而达到聚类的目的。

clip_image001

                                                                                                图一 

二、基础知识

1、无向权重图

对于一个图G,我们定义点的集合V和边的集合E来描述,记为G(V,E),其中V=(v1, v2,...,vn)。定义wij是点vi和vj之间的权重,对于无向图,则有wij=wji。若两点vi和vj之间有边连接,则wij>0,若没有则wij=0。图中任意一点vi的度di就是与之相连的所有边的权重之和,即

                                                                                        d_{i}=\sum _{j=1}^{n}w_{ij}

 接着,我们利用所有点的度构建一个NxN的度矩阵D,它是一个对角矩阵,定义如下

 利用所有点之间的权重值,我们可以得到一个NxN的邻接矩阵,wij就是我们邻接矩阵第i行和第j列的权重wij。

2、相似度矩阵

事实上,在谱聚类中我们并没有直接给出权重,因此无法直接构建邻接矩阵。因此,在谱聚类中的基本思想是,距离较远的两点之间权重值较低,距离近的权重值较高,在定量的给定权重值时,我们是通过样本点距离度量的相似度矩阵S来得到邻接矩阵W的。为了得到相似度矩阵,从而求出W,我们一般有三类方法:\epsilon​​​​​​​​​​​​​​-近邻法,k-近邻法和全连接法。

 (1)对于\epsilon-近邻法,设置一个距离阈值\epsilon​​​​​​​​​​​​​​,然后用欧氏距离Sij度量任意两点间的距离,即相似度矩阵​​​​​​​s_{ij}=\left \| x_{i}-x_{j}\right \|_{2}^{2},然后根据sij和\epsilon的大小关系,来定义邻接矩阵W如下:

 (2)对于k近邻法,我们利用KNN算法遍历所有样本点,取每个样本最近的k个点作为近邻,只有和样本距离最近的k个点之间的wij>0,但这种方法造成重构后的邻接矩阵W不是堆成的,,为解决这一问题,可以使用如下两种方法来解决:

 

(3)对于全连接法 (使用最普遍),由于所有点之间的权重都大于0,所以叫全连接法。我们使用不同的核函数来定义边权重,常用的有多项式核函数,高斯核函数和Sigmoid核函数,最常用的是高斯核函数RBF,此时相似度矩阵和邻接矩阵相同:

3、拉普拉斯矩阵

拉普拉斯矩阵的定义是L=D-W。D为度矩阵,W为邻接矩阵。拉普拉斯具有一些较好的性质,如下:

(1)是对称矩阵

(2)所有的特征值都是实数

(3)对于任意向量Z,有:

 (4)是半正定的,且对应的n个实数特征值都大于等于0,且最小的特征值为0,。

4、无向图切图

 对于无向图G进行切图,将图切成k个子图,每个子图点的集合为A1,A2,...,Ak,满足

对任意两个字图A和B,我们定义 它们之间的切图权重为:

对于k个子图点的集合:A1,A2,...Ak,我们定义切图为:

但是如何使得子图内权重高,子图间权重低,我们需要运用谱聚类的方法进行切图,找到最优化方法。 

三、谱聚类操作

1、Normarized cut方法

该方法同时考虑最小化cut边和划分平衡,以免出现图一种的单独H的情况,划分标准是:子图各个端点的度之和。

clip_image016

2、Min cut方法

如上述方法中的计算方法,优化目标函数如下:

clip_image014

3、Ratio Cut方法

该方法同时考虑最小化cut边和划分平衡,最优化目标函数为:

 

clip_image018

四、算法流程

1、构建相似度矩阵S

2、根据相似度矩阵构建邻接矩阵W和度矩阵D

3、计算拉普拉斯矩阵L,并求出标准化后的拉普拉斯矩阵D-1/2LD-1/2

4、计算D-1/2LD-1/2最小的k1个特征值所对应的特征向量f,并对f组成的矩阵按行标准化,最终组成nxk1维的特征矩阵F

5、将F中的每一行作为一个样本,共n个样本,使用聚类方法进行聚类,聚类维数为k2

6、得到簇划分C(c1,c2,...,ck2)

五、补充

上面,我们讲了拉普拉斯矩阵是通过L=D-W来构造,拉普拉斯矩阵还可以通过相似度矩阵来构造,方法如下:

相似度矩阵是由权值矩阵得到的:

其中 ,然后利用相似度矩阵S构造Laplacian矩阵:

 注:在第一种方法中,求解的是Laplacian矩阵的前个最小特征值对应的特征向量,在第二种方法中,求解的是Laplacian矩阵的前个最大特征值对应的特征向量

谱聚类算法的主要优点有:
1)谱聚类只需要数据之间的相似度矩阵,因此对于处理稀疏数据的聚类很有效。这点传统聚类算法比如K-Means很难做到
2)由于使用了降维,因此在处理高维数据聚类时的复杂度比传统聚类算法好。
谱聚类算法的主要缺点有:
1)如果最终聚类的维度非常高,则由于降维的幅度不够,谱聚类的运行速度和最后的聚类效果均不好。

2)聚类效果依赖于相似矩阵,不同的相似矩阵得到的最终聚类效果可能很不同。

 

 参考:

https://www.cnblogs.com/pinard/p/6221564.html

https://www.cnblogs.com/sparkwen/p/3155850.html


http://chatgpt.dhexx.cn/article/GvLxGXn9.shtml

相关文章

了解聚类是什么。聚类方法:k-means、核聚类、层次聚类、谱聚类

聚类 1.什么是聚类2.聚类方法2.1 划分式聚类方法k-meansk-meansbi-kmeans 基于密度的方法DBSCANOPTICS算法 层次化聚类算法核聚类支持向量聚类谱聚类引言优缺点步骤 参考文档:参考 1.什么是聚类 定义 聚类(Clustering) 是按照某个特定标准(如距离)把一个数据集分割成不同的类…

【聚类】谱聚类解读、代码示例

【聚类】谱聚类详解、代码示例 文章目录 【聚类】谱聚类详解、代码示例1. 介绍2. 方法解读2.1 先验知识2.1.1 无向权重图2.1.2 拉普拉斯矩阵 2.2 构建图(第一步)2.2.1 ϵ \epsilon ϵ 邻近法2.2.2 k 近邻法2.2.3 全连接法 2.3 切图(第二步&a…

谱聚类(Spectral Clustering)原理及Python实现

谱聚类原理及Python实现 图模型 无向带权图模型 G<V,E> G < V , E > &#xff0c;每一条边上的权重 wij w i j 为两个顶点的相似度&#xff0c;从而可以定义相似度矩阵 W W ,此外还可以定义度矩阵D" role="presentation" style="position: …

谱聚类算法(Spectral Clustering)

谱聚类算法(Spectral Clustering) 谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图&#xff0c;使子图内部尽量相似&#xff0c;而子图间距离尽量距离较远&#xff0c;以达到常见的聚类的目的。其中的最优是指最优目标…

谱聚类(spectral clustering)及其实现详解

Preface 开了很多题&#xff0c;手稿都是写好一直思考如何放到CSDN上来&#xff0c;一方面由于公司技术隐私&#xff0c;一方面由于面向对象不同&#xff0c;要大改&#xff0c;所以一直没贴出完整&#xff0c;希望日后可以把开的题都补充全。 先把大纲列出来&#xff1a; 一…

谱聚类算法

1. 算法思想 将所有的数据看成空间中的点&#xff0c;这些点之间可以用边连接起来。距离较远的点之间边的权重低&#xff0c;距离较近的点间边的权重高。然后对原图进行切图&#xff0c;使得不同子图间边的权重之和尽可能低&#xff0c;子图内边的权重之和尽可能高&#xff0c…

谱聚类(Spectral Clustering)算法介绍

一. 前言 本来想写关于聚类系列算法的介绍,但是聚类系列的其它几个算法原理比较简单,网上有大量的教程可以查阅。这里主要是介绍一下谱聚类算法,做一个学习笔记,同时也希望对想要了解该算法的朋友有一个帮助。关于聚类的其他系列算法,这里推荐一个写的很不错的博客。 谱…

聚类系列-谱聚类(spectral clustering)

聚类讲到此&#xff0c;也是我聚类系列的最后一篇博客了&#xff0c;最后一篇的话我们就来讲一下谱聚类。 谱聚类&#xff08;spectral clustering&#xff09;是一种基于图论的聚类方法&#xff0c;主要思想是把所有的数据看做空间中的点&#xff0c;这些点之间可以用边连接起…

谱聚类(spectral clustering)

1. 谱聚类概述 谱聚类是从图论中演化出来的算法&#xff0c;后来在聚类中得到了广泛的应用。它的主要思想是把所有的数据看做空间中的点&#xff0c;这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低&#xff0c;而距离较近的两个点之间的边权重值较高&#x…

谱聚类

谱聚类&#xff08;spectral clustering&#xff09;原理总结&#xff1a; 谱聚类&#xff08;spectral clustering&#xff09;是广泛使用的聚类算法&#xff0c;比起传统的K-Means算法&#xff0c;谱聚类对数据分布的适应性更强&#xff0c;聚类效果也很优秀&#xff0c;同时…

【机器学习】谱聚类(Spectral Clustering)

疑问 谱聚类的概念 谱聚类是一种针对图结构的聚类方法&#xff0c;将每个点都看作是一个图结构上的点&#xff0c;所以&#xff0c;判断两个点是否属于同一类的依据就是&#xff0c;两个点在图结构上是否有边相连&#xff0c;可以是直接相连也可以是间接相连。本质上就是一个图…

介绍谱聚类(spectral clustering)

文章目录 1、谱聚类概览2、谱聚类构图3、拉普拉斯矩阵4、切图聚类4.1RatioCut4.2Ncut5、总结流程 1、谱聚类概览 谱聚类演化于图论&#xff0c;后由于其表现出优秀的性能被广泛应用于聚类中&#xff0c;对比其他无监督聚类&#xff08;如kmeans&#xff09;&#xff0c;spectr…

聚类算法之谱聚类

谱聚类 1. 基本原理 它的主要思想&#xff1a;把所有数据看成空间中的点&#xff0c;这些点之间可以用变连接起来&#xff0c;距离较远的两个点之间的边权重较低&#xff0c;而距离较近的两个点之间的权重较高&#xff0c;通过对所有数据点组成的图进行切图&#xff0c;让切图…

非常全面的谱聚类算法原理总结

谱聚类算法是目前最流行的聚类算法之一&#xff0c;其性能及适用场景优于传统的聚类算法如k-均值算法&#xff0c;本文对谱聚类算法进行了详细总结&#xff0c;内容主要参考论文《A Tutorial on Spectral Clustering》&#xff0c;下载链接&#xff1a;https://github.com/zhan…

C语言遍历文件目录:readdir,opendir

环境&#xff1a;Linux系统 头文件&#xff1a; #include<sys/types.h> #include<dirent.h> 一、opendir 原型 DIR* opendir (const char * path ); 参数与功能 path为目录路径&#xff0c;打开一个目录&#xff0c;在失败的时候返回一个空的指针。 返回值…

嵌入式学习之Linux系统编程---9 目录IO之readdir函数

1、readdir函数的函数原型 #include <dirent.h> struct dirent *readdir(DIR *dirp);对于readdir函数来说&#xff0c;它只有目录流指针这一个参数&#xff0c;这个目录流指针就是使用opendir这个函数的返回值。 该函数在man手册的第三页&#xff0c;该函数如果执行成功…

readdir函数解析

函数原型: struct dirent *readdir(DIR *dirp); 首先纠正一个很多人都错误理解的事实,readdir不是系统调用,它是glibc的封装函数,而且readdir系统调用是存在的,原型如下: int readdir(unsigend int fd, struct old_linux_dirent *dirp, unsigned int count); glibc的readdi…

C/C++的readdir和readdir_r函数(遍历目录)

1.首先要打开目录文件 DIR *opendir( const char *name); DIR *fdopendir( int fd); 2.读取目录文件信息的函数 注意&#xff1a;这是个库函数 struct dirent *readdir( DIR *dirp); int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **res…

Linux下 C 遍历目录(opendir,readdir函数)

opendir()函数: 头文件&#xff1a; #include <sys/types.h> #include <dirent.h> 函数原型&#xff1a; Dir* opendir(const char* pathname); 函数功能&#xff1a; 获取pathname目录下的所有文件和目录的列表&#xff0c;如果pathname是个文件或失败则返…

linux——读取文件(read)

ssize_t read(int fd, void *buf, size_t count); 将fd中的内容读取到buf中。 代码&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <string.h> #inc…