Spectral clustering(谱聚类)算法的实现

article/2025/10/8 22:13:46

目录

  • 1.作者介绍
  • 2.关于谱聚类的介绍
    • 2.1 谱聚类概述
    • 2.2 无向权重图
    • 2.3 邻接矩阵
    • 2.4 相似矩阵
    • 2.5 度矩阵
    • 2.6 拉普拉斯矩阵
    • 2.7 K-Means
  • 3.Spectral clustering(谱聚类)算法实现
    • 3.1 数据集
    • 3.2 导入所需要的包
    • 3.3 获取特征值和特征向量
    • 3.4 利用K-Means聚类
    • 3.5 完整代码
  • 4.参考

1.作者介绍

刘然,女,西安工程大学电子信息学院,2021级研究生
研究方向:图像处理
电子邮件:1654790996@qq.com

刘帅波,男,西安工程大学电子信息学院,2021级研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:1461004501@qq.com

2.关于谱聚类的介绍

2.1 谱聚类概述

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

2.2 无向权重图

对于一个图G,我们一般用点的集合V和边的集合E来描述。即为G(V,E)。其中V即为我们数据集里面所有的点(v1,v2,…vn)。对于V中的任意两个点,点vi和点vj,我们定义权重wij为二者之间的权重。由于是无向图,所以wij=wji。

2.3 邻接矩阵

邻接矩阵(Adjacency Matrix):是表示顶点之间相邻关系的矩阵。在如图2-1所示的权重图当中(假设各权重为1),其邻接矩阵可表示为图2-2所示。
在这里插入图片描述
在这里插入图片描述

2.4 相似矩阵

在谱聚类中,我们只有数据点的定义,并没有直接给出这个邻接矩阵,所以我们可以通过样本点距离度量的相似矩阵S来获得邻接矩阵W。

2.5 度矩阵

度矩阵是对角阵,对角上的元素为各个顶点的度。图2-1的度矩阵为图2-3所示。
在这里插入图片描述

2.6 拉普拉斯矩阵

拉普拉斯矩阵L=D-W,其中D为度矩阵,W为邻接矩阵。图2-1的拉普拉斯矩阵为图2-4所示。
在这里插入图片描述
用拉普拉斯矩阵求解特征值,通过确定特征值(特征值要遵循从小到大的排列方式)的个数来确定对应特征向量的个数,从而实现降维,然后再用kmeans将特征向量进行聚类。

2.7 K-Means

K-Means是聚类算法中的最常用的一种,算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类。
下面,我们描述一下K-means算法的过程,为了尽量不用数学符号,所以描述的不是很严谨,大概就是这个意思,“物以类聚、人以群分”:
1.首先输入k的值,即我们希望将数据集经过聚类得到k个分组。
2.从数据集中随机选择k个数据点作为初始大哥(质心,Centroid)
3.对集合中每一个小弟,计算与每一个大哥的距离(距离的含义后面会讲),离哪个大哥距离近,就跟定哪个大哥。
4.这时每一个大哥手下都聚集了一票小弟,这时候召开人民代表大会,每一群选出新的大哥(其实是通过算法选出新的质心)。
5.如果新大哥和老大哥之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),可以认为我们进行的聚类已经达到期望的结果,算法终止。
6.如果新大哥和老大哥距离变化很大,需要迭代3~5步骤。

3.Spectral clustering(谱聚类)算法实现

3.1 数据集

本实验中使用到的数据集均由sklearn.datasets中提供的方法生成,本实验中用到了make_circles,make_moons,make_blobs等函数。make_circles生成数据集,形成一个二维的大圆,包含一个小圆,如图3-1所示;make_moons生成数据集,形成两个弯月,如图3-2所示;make_blobs为聚类生成符合正态分布的数据集,如图3-3所示。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.2 导入所需要的包

#导入需要的包
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import make_moons#生成数据集,形成两个弯月。
from sklearn.datasets import make_circles#生成数据集,形成一个二维的大圆,包含一个小圆
from sklearn.datasets import make_blobs#为聚类生成符合正态分布的数据集,产生一个数据集和相应的标签
import matplotlib.pyplot as plt

3.3 获取特征值和特征向量

def get_eigen(L, num_clusters):#获取特征eigenvalues, eigenvectors = np.linalg.eigh(L)#获取特征值  特征向量best_eigenvalues = np.argsort(eigenvalues)[0:num_clusters]#argsort函数返回的是数组值从小到大的索引值U = np.zeros((L.shape[0], num_clusters))U = eigenvectors[:, best_eigenvalues]#将这些特征取出 构成新矩阵return U

3.4 利用K-Means聚类

#K-Means聚类
def cluster(data, num_clusters):data = np.array(data)W = affinity_matrix(data)D = getD(W)L = getL(D, W)eigenvectors = get_eigen(L, num_clusters)clf = KMeans(n_clusters=num_clusters)s = clf.fit(eigenvectors)  # 聚类label = s.labels_return label

3.5 完整代码

#导入需要的包
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import make_moons#生成数据集,形成两个弯月。
from sklearn.datasets import make_circles#生成数据集,形成一个二维的大圆,包含一个小圆
from sklearn.datasets import make_blobs#为聚类生成符合正态分布的数据集,产生一个数据集和相应的标签
import matplotlib.pyplot as plt#定义高斯核函数
def kernel(x1, x2, sigma_sq=0.05):return np.exp(-(np.linalg.norm(x1 - x2) ** 2) / (2 * sigma_sq ** 2))#定义相似度矩阵
def affinity_matrix(X):A = np.zeros((len(X), len(X)))#零矩阵for i in range(len(X) - 1):#长度为len(x) 但是从0开始for j in range(i + 1, len(X)):#从1开始,到len(x) 是方阵 为啥下角标取值的初始值不同???A[i, j] = A[j, i] = kernel(X[i], X[j])return A#通过高斯核的计算 给矩阵赋予新值    10*10# 计算度矩阵
def getD(A):D = np.zeros(A.shape)for i in range(A.shape[0]):D[i, i] = np.sum(A[i, :])return D#计算拉普拉斯矩阵
def getL(D, A):L = D - Areturn Ldef get_eigen(L, num_clusters):#获取特征eigenvalues, eigenvectors = np.linalg.eigh(L)#获取特征值  特征向量best_eigenvalues = np.argsort(eigenvalues)[0:num_clusters]#argsort函数返回的是数组值从小到大的索引值U = np.zeros((L.shape[0], num_clusters))U = eigenvectors[:, best_eigenvalues]#将这些特征取出 构成新矩阵return U#K-Means聚类
def cluster(data, num_clusters):data = np.array(data)W = affinity_matrix(data)D = getD(W)L = getL(D, W)eigenvectors = get_eigen(L, num_clusters)clf = KMeans(n_clusters=num_clusters)s = clf.fit(eigenvectors)  # 聚类label = s.labels_return labeldef plotRes(data, clusterResult, clusterNum):"""结果可似化: data:  样本集: clusterResult: 聚类结果: clusterNum: 聚类个数:return:"""n = len(data)scatterColors = ['black', 'blue', 'red', 'yellow', 'green', 'purple', 'orange']for i in range(clusterNum):color = scatterColors[i % len(scatterColors)]x1 = []y1 = []for j in range(n):if clusterResult[j] == i:x1.append(data[j, 0])y1.append(data[j, 1])plt.scatter(x1, y1, c=color, marker='+')if __name__ == '__main__':
# # #月牙形数据集,sigma=0.1
# #     # cluster_num = 2
# #     # data, target = make_moons()
# #     # label = cluster(data, cluster_num)
# #     # print(label)
# #     # plotRes(data, label, cluster_num)
# #
#     # 圆形数据集,sigma=0.05cluster_num = 2data, target = make_circles(n_samples=1000, shuffle=True, noise=0.05, factor=0.5)label = cluster(data, cluster_num)print(label)plotRes(data, label, cluster_num)# #
# #    #  # 正态数据集
# #    # # n_samples是待生成的样本的总数。
# #    #  # n_features是每个样本的特征数。
# #    #  # centers表示类别数。
# #    #  # cluster_std表示每个类别的方差,例如我们希望生成2类数据,其中一类比另一类具有更大的方差,可以将cluster_std设置为[1.0, 3.0]。
# #    #  cluster_num = 2
# #    #  data, target = make_blobs(n_samples=1500, n_features=2, centers=4, random_state=24)
# #    #  label = cluster(data, cluster_num)
# #    #  print(label)
# #    #  plt.subplot(121)
# #    #  plotRes(data, target, cluster_num)
# #    #  plt.subplot(122)
# #    #  plotRes(data, label, cluster_num)
# #
plt.show()

4.参考

1.<谱聚类(spectral clustering)原理总结 - 刘建平Pinard - 博客园
2.参考博客1
3.参考博客2
4.参考博客3


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

相关文章

Python学习4-谱聚类

一&#xff0c;谱聚类原理 谱聚类算法原理可以参考如下链接。 这个视频推导出了拉普拉斯矩阵&#xff0c;但没有更新后续优化问题。 机器学习-白板推导系列(二十二)-谱聚类&#xff08;Spectral Clustering&#xff09;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV…

机器学习-层次聚类(谱系聚类)算法

文章目录 简介距离矩阵最短距离法最长距离法类平均法重心法python应用 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 层次聚类&#xff08;Hierarchical Clustreing&#xff09;又…

到底什么是谱聚类算法?

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达本文转自&#xff1a;视学算法 谱聚类算法是目前最流行的聚类算法之一&#xff0c;其性能及适用场景优于传统的聚类算法如k-均值算法&#xff0c;本文对谱聚类算法进行了…

图像聚类-谱聚类

最近做的一个东西跟这个相关&#xff0c;本来希望是用深度学习对于没有标签的图像数据进行分类&#xff0c;但是通常情况下&#xff0c;深度学习是对有标签的数据进行学习&#xff0c;目的是用来自动提取特征&#xff0c;代替传统的手工提取特征。因此&#xff0c;比较容易想到…

聚类算法实践(二)——谱聚类、Chameleon聚类

上一篇文章里说到的层次聚类和K-means聚类&#xff0c;可以说是聚类算法里面最基本的两种方法&#xff08;wiki的cluster analysis页面都把它们排前两位&#xff09;。这次要探讨的&#xff0c;则是两个相对“高级”一点的方法&#xff1a;谱聚类和chameleon聚类。 4、谱聚类 …

谱聚类的案例

1. 政治博客数据集(见附件Pol_Blogs_CSV文件) 数据集网址一: Political blogs 数据集网址二: http://www.casos.cs.cmu.edu/computational_tools/datasets/external/polblogs/index11.php 政治博客数据是由Adamic和Glance于2005年收集并分析的. 该数据集包含了2004年美国总…

谱聚类算法 matlab

1、谱聚类算法步骤公式 &#xff08;1&#xff09;整理数据集&#xff0c;使数据集中数据在0-1之间。假设数据集m行n列。 &#xff08;2&#xff09;求邻接矩阵W。元素值为每一点到其他点之间距离&#xff0c;即权重。 &#xff08;3&#xff09;求相似度矩阵S&#xff0c;相…

谱聚类(Spectral Clustering)详解

原文地址为&#xff1a; 谱聚类(Spectral Clustering)详解 谱聚类(Spectral Clustering)详解 谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图&#xff0c;使子图内部尽量相似&#xff0c;而子图间距离尽量距离较远&…

从拉普拉斯矩阵说到谱聚类

从拉普拉斯矩阵说到谱聚类 0 引言 11月1日上午&#xff0c;机器学习班 第7次课&#xff0c;邹讲聚类&#xff08;PPT&#xff09;&#xff0c;其中的谱聚类引起了自己的兴趣&#xff0c;邹从最基本的概念&#xff1a;单位向量、两个向量的正交、方阵的特征值和特征向量&#xf…

聚类--谱聚类

前言&#xff1a;关于谱聚类&#xff0c;已经有很多厉害的老师和大牛写过教程博客等&#xff0c;也有很不错的tutorial文章可供参考。此博文仅记述个人的一些总结、思考、疑问&#xff0c;算是对现有谱聚类学习资源的一个小补充。 1. 谱聚类简述 说到聚类&#xff0c;可能最先…

MATLAB 谱聚类

k-means 可以说是思想最简单的聚类了&#xff0c;但是它在应对非凸数据时却显得手足无措&#xff0c;例如如下的数据分类&#xff1a; 各类之间虽然间隔较远&#xff0c;但是非凸&#xff0c;这时候就需要引入谱聚类了(以下为谱聚类效果)。 本文参考 [1]Ulrike von Luxburg. A…

谱聚类算法详解

谱聚类&#xff08;Spectral Clustering&#xff09;算法简单易行&#xff0c;其聚类性能优于传统的K-means算法。谱聚类将数据的划分转化为对图的分割&#xff0c;是一种基于图论的聚类方法&#xff0c;其直观理解为根据图内点的相似度将图分为多个子图&#xff0c;使子图内部…

谱聚类算法简单理解

一、算法思想 谱聚类是基于图论的知识所演化出的算法&#xff0c;在聚类中广泛使用。主要思想是将所有的数据看成空间中的点&#xff0c;这些点之间可以用边连接起来&#xff0c;距离较远的两点之间边的权重值较低&#xff0c;距离较近的两点间边的权重值较高&#xff0c;然后…

了解聚类是什么。聚类方法: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 构建图&#xff08;第一步&#xff09;2.2.1 ϵ \epsilon ϵ 邻近法2.2.2 k 近邻法2.2.3 全连接法 2.3 切图&#xff08;第二步&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)算法介绍

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