谱聚类算法(Spectral Clustering)

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

谱聚类算法(Spectral Clustering)

谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的目的。其中的最优是指最优目标函数不同,可以是割边最小分割——如图1的Smallest cut(如后文的Min cut), 也可以是分割规模差不多且割边最小的分割——如图1的Best cut(如后文的Normalized cut)。

clip_image001图1 谱聚类无向图划分——Smallest cut和Best cut

这样,谱聚类能够识别任意形状的样本空间且收敛于全局最优解,其基本思想是利用样本数据的相似矩阵(拉普拉斯矩阵)进行特征分解后得到的特征向量进行聚类。

1 理论基础

对于如下空间向量item-user matrix:

clip_image002

如果要将item做聚类,常常想到k-means聚类方法,复杂度为o(tknm),t为迭代次数,k为类的个数、n为item个数、m为空间向量特征数:

1 如果M足够大呢?

2 K的选取?

3 类的假设是凸球形的?

4 如果item是不同的实体呢?

5 Kmeans无可避免的局部最优收敛?

……

这些都使常见的聚类问题变得相当复杂。

1.1 图的表示

如果我们计算出item与item之间的相似度,便可以得到一个只有item的相似矩阵,进一步,将item看成了Graph(G)中Vertex(V),歌曲之间的相似度看成G中的Edge(E),这样便得到我们常见的图的概念。

对于图的表示(如图2),常用的有:

邻接矩阵:E,eij表示vi和vi的边的权值,E为对称矩阵,对角线上元素为0,如图2-2。

Laplacian矩阵:L = D – E, 其中di (行或列元素的和),如图2-3。

clip_image004图2 图的表示

1.2 特征值与L矩阵

先考虑一种最优化图像分割方法,以二分为例,将图cut为S和T两部分,等价于如下损失函数cut(S, T),如公式1所示,即最小(砍掉的边的加权和)。

clip_image006

假设二分成两类,S和T,用q(如公式2所示)表示分类情况,且q满足公式3的关系,用于类标识。

那么:

clip_image008

其中D为对角矩阵,行或列元素的和,L为拉普拉斯矩阵。

由:

clip_image010clip_image011

有:

1、 L为对称半正定矩阵,保证所有特征值都大于等于0;

2、 L矩阵有唯一的0特征值,其对应的特征向量为1

离散求解q很困难,如果将问题松弛化为连续实数值,由瑞利熵的性质知其二将你型的最小值就是L的特征值们(最小值,第二小值,......,最大值分别对应矩阵L的最小特征值,第二小特征值,......,最大特征值,且极值q相应的特征向量处取得,请参见瑞利熵(Rayleigh quotient))。

写到此,不得不对数学家们致敬,将cut(S,T),巧妙地转换成拉普拉斯矩阵特征值(向量)的问题,将离散的聚类问题,松弛为连续的特征向量,最小的系列特征向量对应着图最优的系列划分方法。剩下的仅是将松弛化的问题再离散化,即将特征向量再划分开,便可以得到相应的类别,如将图3中的最小特征向量,按正负划分,便得类{A,B,C}和类{D,E,F,G}。在K分类时,常将前K个特征向量,采用kmeans分类。

PS:

1、此处虽再次提到kmeans,但意义已经远非引入概念时的讨论的kmeans了,此处的kmeans,更多的是与ensemble learning相关,在此不述;

2、k与聚类个数并非要求相同,可从第4节的相关物理意义中意会;

3、在前k个特征向量中,第一列值完全相同(迭代算法计算特征向量时,值极其相近),kmeans时可以删除,同时也可以通过这一列来简易判断求解特征值(向量)方法是否正确,常常问题在于邻接矩阵不对称。

clip_image012

图3 图的L矩阵的特征值与特征向量

2 最优化方法

在kmeans等其它聚类方法中,很难刻划类的大小关系,局部最优解也是无法回避的漏病。当然这与kmeans的广泛使用相斥——原理简单。

2.1 Min cut方法

如2.2节的计算方法,最优目标函数如下的图cut方法:

clip_image014

计算方法,可直接由计算L的最小特征值(特征向量),求解。

2.2 Nomarlized cut方法

Normarlized cut,目标是同时考虑最小化cut边和划分平衡,以免像图1中的cut出一个单独的H。衡量子图大小的标准是:子图各个端点的Degree之和。

clip_image016

2.3 Ratio Cut 方法

Ratio cut的目标是同时考虑最小化cut边和划分平衡,以免像图1中的cut出一个单独的H。

最优目标函数为:

clip_image018

2.4 Normalized相似变换

归一化的L矩阵有:

clip_image020

因而L的最小特征值与D-(1/2)E D-(1/2)的最大特征值对应。

而计算的L相比计算L要稍具优势,在具体实用中,常以L替代L,但是min cut和ratio cut不可以。

PS:这也是常常在人们的博客中,A说谱聚类为求最大K特征值(向量),B说谱聚类为求最小K个特征值(向量的原因)。

3 谱聚类步骤

第一步:数据准备,生成图的邻接矩阵;

第二步:归一化普拉斯矩阵;

第三步:生成最小的k个特征值和对应的特征向量;

第四步:将特征向量kmeans聚类(少量的特征向量);

4 谱聚类的物理意义

谱聚类中的矩阵:

clip_image022

可见不管是L、L都与E联系特别大。如果将E看成一个高维向量空间,也能在一定程度上反映item之间的关系。将E直接kmeans聚类,得到的结果也能反映V的聚类特性,而谱聚类的引入L和L是使得G的分割具有物理意义。

而且,如果E的item(即n)足够大,将难计算出它的kmeans,我们完全可以用PCA降维(仍为top的特征值与向量)。

上述对将E当成向量空间矩阵,直观地看符合我们的认知,但缺乏理论基础;而L(L等)的引入,如第2节所述,使得计算具有理论基础,其前k个特征向量,也等价于对L(L等)的降维。

因而聚类就是为图的划分找了理论基础,能达到降维的目的。

其中不少图出源于Mining of Massive Datasets,对于同仁们的布道授业,一并感谢。

推荐相关相关文档:Wen-Yen Chen, Yangqiu Song, Hongjie Bai, Chih-Jen Lin, Edward Y. Chang. Parallel Spectral Clustering in Distributed Systems.

推荐相关源码:https://code.google.com/p/pspectralclustering/ (真心很赞)

------

只能永远把艰辛的劳动看作是生命的必要;即使没有收获的指望,也能心平气和的继续耕种。

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

相关文章

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

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

谱聚类算法

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

谱聚类(Spectral Clustering)算法介绍

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

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

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

谱聚类(spectral clustering)

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

谱聚类

谱聚类(spectral clustering)原理总结: 谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时…

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

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

介绍谱聚类(spectral clustering)

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

聚类算法之谱聚类

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

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

谱聚类算法是目前最流行的聚类算法之一,其性能及适用场景优于传统的聚类算法如k-均值算法,本文对谱聚类算法进行了详细总结,内容主要参考论文《A Tutorial on Spectral Clustering》,下载链接: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…

linux的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…

readdir函数

readdir会不断读取目中的文件及目录&#xff0c;但不会读子目录中的文件。 #include <sys/types.h> #include <dirent.h> #include <stdio.h> #include <stdlib.h> #include <dirent.h> int main() {DIR *dirp opendir("/home/python/Des…

readdir不保证读取的文件顺序

readdir用于读取某个文件夹中的全部文件或文件夹&#xff0c;相当于ls。 但是readdir并不保证读取后的文件顺序&#xff0c;在不同的操作系统上可能有不同的顺序。 在某些场景下需要注意&#xff0c;比如读取配置文件时&#xff0c;可能会根据配置文件进行一些初始化&#xf…

Ubuntu 18.04安装远程桌面

Ubuntu 18.04安装远程桌面 陈拓 2021/08/05-2020/08/08 1. Putty登录 IP地址 192.168.0.103 登录账户 ccdc xxxxxxxx 2. Ubuntu 18.04安装桌面 如果安装的系统已经带桌面跳过这一步。 2.1 查看linux系统版本 lsb_release -a 2.2 安装桌面 sudo apt-get install ubun…