目录

  • 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

Spectral clustering(谱聚类)算法的实现相关推荐

  1. CS224W-图神经网络 笔记5.2:Spectral Clustering - 谱聚类主要思想及关键结论的证明

    CS224W-图神经网络 笔记5.2:Spectral Clustering - 谱聚类主要思想及关键结论的证明 本文总结之日CS224W Winter 2021只更新到了第四节,所以下文会参考202 ...

  2. CS224W-图神经网络 笔记5.1:Spectral Clustering - 谱聚类基础知识点

    CS224W-图神经网络 笔记5.1:Spectral Clustering - 谱聚类基础知识点 本文总结之日CS224W Winter 2021只更新到了第四节,所以下文会参考2021年课程的PP ...

  3. Spectral clustering 谱聚类讲解及实现

    简述 https://github.com/Sean16SYSU/MachineLearningImplement 这篇是在网上看了wiki之后写出来的代码. 附上一篇看过论文之后根据论文实现的版本: ...

  4. spectral clustering谱聚类论文解读(上)

    关于A Tutorial on Spectral Clustering的解读 1.介绍 2.相似图 2.1 图的标号 2.2 不同的相似图 3.拉普拉斯图与它的基础参数 3.1未归一化的拉普拉斯矩阵 ...

  5. 社区发现算法——(Spectral Clustering)谱聚类算法

    归一化的拉普拉斯(The unnormalized graph Laplacian): L=D−WL = D - W L=D−W 其中D为对角度矩阵,W为权重邻接矩阵. 1.矩阵L满足以下性质: 对于 ...

  6. CS224W-图神经网络 笔记5.3:Spectral Clustering - 谱图聚类的具体操作步骤

    CS224W-图神经网络 笔记5.3:Spectral Clustering - 谱图聚类的具体操作步骤 本文总结之日CS224W Winter 2021只更新到了第四节,所以下文会参考2021年课程 ...

  7. 模糊C均值聚类算法的实现

     模糊C均值聚类算法的实现 研究背景 聚类分析是多元统计分析的一种,也是无监督模式识别的一个重要分支,在模式分类 图像处理和模糊规则处理等众多领域中获得最广泛的应用.它把一个没有类别标记的样本按照 ...

  8. K-Means聚类算法的实现(C语言)

    最近做了聚类实验,就写了下K-Means算法,C语言实现. 实验给出的数据集比较小,总共有11个:(2, 10), (2, 5), (8, 4), (5, 8), (7, 5), (6, 4), (1 ...

  9. Birch聚类算法的实现

    目录 1.作者介绍 2.BIRCH聚类算法介绍 2.1 BIRCH聚类算法介绍 2.2 聚类特征CF与聚类特征树CF Tree 2.3 Birch聚类算法优缺点 3.scikit-learn学习Bir ...

  10. python谱聚类算法_谱聚类Spectral clustering(SC)

    在之前的文章里,介绍了比较传统的K-Means聚类.Affinity Propagation(AP)聚类.比K-Means更快的Mini Batch K-Means聚类以及混合高斯模型Gaussian ...

最新文章

  1. .NET Framework- 反射特性序列化(Day4)
  2. C++八皇后拼图,打印所有的算法(附完整源码)
  3. QT的QScriptEngineDebugger类的使用
  4. Mockito详细介绍
  5. .net:Code First 创建或更新数据库
  6. 在ASP.NET MVC中实现Select多选
  7. 跳一跳python源码下载_python 微信跳一跳和源码解读
  8. Python+OpenCV:对极几何(Epipolar Geometry)
  9. mixpanel实验教程(2)
  10. 会计需要哪方面的计算机知识,学会计需要哪些知识
  11. 算法资料:算法导论_原书第3版(中文)(PDF带书签)
  12. 二、C++反作弊对抗实战 (进阶篇 —— 10.利用硬件断点 + 结构化异常VEH HOOK与对抗方法)
  13. 自己忙碌十年,发现空空的,该填满了
  14. toms 尺寸 shoes or boots finds
  15. 关于eclipse项目中项目上直接出现大红感叹号的问题
  16. Ubuntu X86编译安装Gstreamer nvenc插件(硬件编码)
  17. DBA与项目的那堆事 ——目录
  18. Java String类源码阅读笔记
  19. vue两个数组如何判断值是否相同_vue两个数组如何判断重复的数据?
  20. 磷酸铁锂电池回收浸出液除铝

热门文章

  1. pythonturtle艺术字_字体风格迁移,卷积神经网络打败艺术字,生成最美汉字
  2. 计算机被填充背景花束纹理在那,为艺术字设置纹理填充的两种方法
  3. 运行java程序需要的工具软件的目录,运行Java程序需要的工具软件所在的目录是A.JDK的bin目录B.JDK的demo目录C.JDK的lib目录D.JDKR的j...
  4. 微信公众号接入智能客服机器人可以实现哪些效果
  5. 如何在A4相纸上打印4张5寸相片
  6. 《现代控制系统》第五章——反馈控制系统性能分析 5.3 二阶系统的性能
  7. 区块链从业者地摊致富秘籍
  8. NFT艺术品交易平台
  9. 【LeetCode击败99%+】猜数字大小
  10. 小白某东商品评论爬虫+词云 python