谱聚类算法

article/2025/10/9 0:09:10

1. 算法思想

  • 将所有的数据看成空间中的点,这些点之间可以用边连接起来。距离较远的点之间边的权重低,距离较近的点间边的权重高。然后对原图进行切图,使得不同子图间边的权重之和尽可能低,子图内边的权重之和尽可能高,迭代的删除最长的边,从而达到聚类的目的(如下图)。
  • 简而言之,谱聚类先降维(特征分解),然后在低维空间用其它聚类算法(如KMeans、模糊聚类)进行聚类。
    谱聚类

2. 算法流程

  • 输入:样本集D=(x1,x2,…,xn),相似矩阵的生成方式, 降维后的维度k1, 聚类方法,聚类后的维度k2
  • 输出:簇划分C(c1,c2,…ck2).

(1)构建相似度矩阵(邻接矩阵)W
(2)构建度矩阵D
(3)计算拉普拉斯矩阵L标准化后的拉普拉斯矩阵Lrm
(4)特征分解:计算Lrm最小的k1个特征值所各自对应的特征向量
(5)将各自对应的特征向量组成的矩阵行标准化,最终组成n×k1维的特征矩阵
(6)对每一行作为一个k1维的样本,用输入的聚类方法进行聚类,聚类维数为k2。
(7)得到簇划分C(c1,c2,…ck2). 
谱聚类流程
对于输入中提及的相似矩阵的生成方式, 说明如下:
(为什么单独说名这一点,见后文缺点分析)

  • 相似矩阵的生成方式
    (1)ϵ-近邻法

    (2)k-近邻法(本文实验所用)

    (3)全连接法

3. 实例展示

  1. 数据集:ringData.mat、GaussianData.mat
    (以下仅展示能说明流程部分的核心代码,如需要完整版含数据集请联系作者)
  2. 实现:
if __name__ == '__main__':cluster_num = 2             #聚类个数KNN_k = 5                   #计算邻接矩阵W会用到data = loaddata()           #读取数据W = getWbyKNN(data,KNN_k)   #相似矩阵D = getD(W)                 #度矩阵L = D-W                     #拉普拉斯矩阵Lrm = (np.matrix(D))*L      #标准化拉普拉斯矩阵eigval,eigvec = getEigVec(L,cluster_num)    #特征值、特征向量print(eigval,eigvec)clf = KMeans(n_clusters=cluster_num)    #KMeans聚类s = clf.fit(eigvec)C = s.labels_centers = getCenters(data,C)            #聚类中心plot(data,s.labels_,centers,cluster_num)
  1. 聚类效果
    数据集:ringData.mat
    数据集:GaussianData.mat

4. 优缺点

  • 回忆:谱聚类可以理解为先降维,再聚类
  • 优点:
    (1)无需事先指定簇的数量(但如果采用kmeans进行聚类,需要指明簇的个数,正如我们下边的实例那里,手动选择簇数为2),当聚类的类别个数较小的时候,谱聚类的效果会很好;
    (2)谱聚类算法使用了降维的技术,所以更加适用于高维数据的聚类;
    (3)谱聚类只需要数据之间的相似度矩阵(邻接矩阵),因此对于处理稀疏数据的聚类很有效。
    (4)与传统的聚类算法相比,它具有能在任意形状的样本空间上聚类且收敛于全局最优解
  • 缺点:
    (1)谱聚类对相似矩阵的改变和聚类参数的选择非常的敏感;
    (2)谱聚类适用于均衡分类问题,对于簇之间点个数相差悬殊的聚类问题,谱聚类则不适用;
    (3)时间和空间复杂度大。

小结:

  • 谱聚类的算法原理的确简单,代码实现比较容易。但是要完全理解,需要对图论中的无向图,线性代数和矩阵分析都有一定的了解。更多细节推导见参考。

参考:
刘建平博客园
b站白板推导
谱聚类–无需指明簇数量的聚类
sklearn谱聚类Spectral Clustering参数及算法原理
Graph特征提取方法–谱聚类
谱聚类拉普拉斯降维
深入浅出地搞懂谱聚类
谱聚类python实现
A Tutorial on Spectral Clustering
聚类算法总结
KNN和K-Means


http://chatgpt.dhexx.cn/article/9jpyF2mQ.shtml

相关文章

谱聚类(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…

ubuntu远程桌面连接windows

ubuntu远程桌面连接windows 1&#xff1a;使用ubuntu自带软件remmina 2&#xff1a;打开该软件后&#xff0c;点击长方形 3&#xff1a; 服务器&#xff1a;windows电脑内网ip 用户名&#xff1a;电脑用户名 密码&#xff1a;电脑用户名的登陆密码 点击右下角&#xff1a;保存…

Ubuntu 远程桌面的方式

提示&#xff1a;仅仅是按照记忆所写的笔记&#xff0c;如果你看到这篇笔记&#xff0c;按照操作出了问题&#xff0c;评论就好了&#xff0c;我会完善一下。笔记内容以外的问题不要评论&#xff0c;我不管。 vino & dconf-editor 该方式适用于ubuntu desktop 18.04 及以后…