简述

  • https://github.com/Sean16SYSU/MachineLearningImplement

这篇是在网上看了wiki之后写出来的代码。

附上一篇看过论文之后根据论文实现的版本:【论文阅读和实现】On Spectral Clustering: Analysis and an algorithm【Python实现】

In multivariate statistics and the clustering of data, spectral clustering techniques make use of the spectrum(eigenvalues) of the similarity matrix of the data to perform dimensionality reduction before clustering in fewer dimensions. The similarity matrix is provided as an input and consists of a quantitative assessment of the relative similarity of each pair of points in the dataset.1 在多元统计和数据聚类当中,谱聚类技术充分利用了数据的相似度矩阵光谱(特征值)来实现在聚类之前的降维到更小的维度下。这个相似度矩阵被提供作为输入,包括有在每对点之间的关联相似度的量化方法。

Given an enumerated set of data points, the similarity matrix may be defined as a symmetric matrix A{\displaystyle A}A , where Aij≥0{\displaystyle A_{ij}\geq 0}Aij0represents a measure of the similarity between data points with indices i{\displaystyle i}i and j{\displaystyle j}j.

给一个可数的点集,相似度矩阵可以被定义为一个对称矩阵 A{\displaystyle A}A , 并且Aij≥0{\displaystyle A_{ij}\geq 0}Aij0表示的是有着下面的index的 i{\displaystyle i}ij{\displaystyle j}j 两个点之间的相似度。

一般来说的谱聚类方法,就是会使用一些标准的聚类方法(包括有Kmean) 相关的拉普拉斯矩阵的特征向量上。 有很多种方式来定义拉普拉斯矩阵,每种都有自己的数学解读。并且因此这个聚类的也会有不同的解读。

这些相关的特征向量是一个基于最小的几个拉普拉斯矩阵的特征值,除了最小的那个0。为了计算的速度,这些特征向量经常被计算为拉普拉斯函数的最大的特征值对应的特征向量。

图问题的拉普拉斯矩阵被定义为

L:=D−AL:=D-AL:=DA
D是对角矩阵,然后对角元为对应节点的度。

一个非常著名相关的谱聚类技术,用到了normalized cuts algorithm ,被广泛用于图片分割。分割的时候,基于的特征想来是对称正则化拉普拉斯矩阵的第二小的特征。 这个矩阵被定义为

Lnorm:=I−D−1/2AD−1/2{\displaystyle L^{\text{norm}}:=I-D^{-1/2}AD^{-1/2}}Lnorm:=ID1/2AD1/2

算法

To perform a spectral clustering we need 3 main steps:2

  1. Create a similarity graph between our N objects to cluster. 在N个对象上创建相似性矩阵
  2. Compute the first k eigenvectors of its Laplacian matrix to define a feature vector for each object. 计算出前k个拉普拉斯矩阵的特征向量,给每个点定义一个表征向量。
  3. Run k-means on these features to separate objects into k classes. 在这个表征向量上再做k-means

针对图算法

  1. 先构建图网络的链接
  2. 计算出拉普拉斯矩阵
  3. 做特征分解,得到特征向量,用于做表征向量
  4. 在这个基础上再做一般的聚类方法

还是一样的,为了封装性,我这就直接写了 函数内嵌套着函数~

import numpy as np
from sklearn.cluster import KMeansdef spectral_cluster(X, n_clusters=3, sigma=1, k=5, n_eigen=10):def graph_building_KNN(X, k=5, sigma=1):N = len(X)S = np.zeros((N, N))for i, x in enumerate(X):S[i] = np.array([np.linalg.norm(x - xi) for xi in X])S[i][i] = 0graph = np.zeros((N, N))for i, x in enumerate(X):distance_top_n = np.argsort(S[i])[1: k+1]for nid in distance_top_n:graph[i][nid] = np.exp(-S[i][nid] / (2 * sigma ** 2))return graphgraph = graph_building_KNN(X, k)def laplacianMatrix(A):dm = np.sum(A, axis=1)D = np.diag(dm)L = D - AsqrtD = np.diag(1.0 / (dm ** 0.5))return np.dot(np.dot(sqrtD, L), sqrtD)L = laplacianMatrix(graph)def smallNeigen(L, n_eigen):eigval, eigvec = np.linalg.eig(L)index = list(map(lambda x: x[1], sorted(zip(eigval, range(len(eigval))))[1:n_eigen+1]))return eigvec[:, index]H = smallNeigen(L, n_eigen)kmeans = KMeans(n_clusters=n_clusters).fit(H)return kmeans.labels_
  • 测试
from sklearn import datasets
from sklearn.decomposition import PCA
iris = datasets.load_iris()
X_reduced = PCA(n_components=2).fit_transform(iris.data)
y = spectral_cluster(X_reduced, k=10, n_clusters=3)
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y, cmap=plt.cm.Set1)

  • 实际图

有部分检测的不是很好,sklearn上的实现的版本,实际上改进之后的版本spectral-embedding,效果好很多。

  • sklearn的谱聚类效果图


  1. https://en.wikipedia.org/wiki/Spectral_clustering ↩︎

  2. https://towardsdatascience.com/spectral-clustering-for-beginners-d08b7d25b4d8 ↩︎

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谱聚类论文解读(上)

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

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

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

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

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

  6. 【论文阅读和实现】On Spectral Clustering: Analysis and an algorithm【Python实现】

    On Spectral Clustering: Analysis and an algorithm https://github.com/Sean16SYSU/MachineLearningImple ...

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

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

  8. 谱聚类算法(Spectral Clustering)

    谱聚类算法(Spectral Clustering) 谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法--将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似 ...

  9. 机器学习算法(7)——K近邻(KNN)、K-means、模糊c-均值聚类、DBSCAN与层次与谱聚类算法

    1.K-近邻算法(KNN)概述 (有监督算法,分类算法) 最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类.但是怎么可能 ...

最新文章

  1. Delphi XE2 之 FireMonkey 入门(23) - 数据绑定: TBindingsList: TBindExpression
  2. 在java中开发图形用户_2016年计算机二级考试《JAVA》习题:编写图形用户界面
  3. 048_Calendar日历
  4. 验证java 递增不是原子操作
  5. 大型打脸现场!被藐视的少女摇身一变成为“抽象代数之母”,哲学教授只能跪地喊爸爸...
  6. 涨知识 | 100个中国最难读的地名,第一个就折了
  7. 如何用阿里云实行全链路数据追踪
  8. 想买个这样的笔记本电脑
  9. 嵌入式USB转RS232九针串口线驱动,及串口软件secureCRT的使用
  10. 加密-网络安全之1号皇帝新衣
  11. 有关 VS winform 开发问题
  12. 沧小海笔记之PCIE协议解析——第一章 PCIE概述(下)
  13. COPY 一种接近最优的导航网格生成算法以及基于导航网格的寻路算法
  14. 中兴服务器isac配置,中兴AC 配置手册V1.0.docx
  15. SG函数和SG定理【详解】
  16. ExtJs自学教程(一)
  17. Python输出csv文件中文乱码及解决
  18. ZOJ 1598 Spherical Triangle
  19. Java实现 LeetCode 278 第一个错误的版本
  20. 工程(二)——DeeplabV3+语义分割训练自制数据集

热门文章

  1. LCD 常用的客观效果指标和测试方法
  2. FFmpeg 源码学习(一):avformat_open_input 源码分析
  3. win server 2008 R2 安装IIS
  4. Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type
  5. QT学习笔记(-): 利用QHttp进行http下载(1)
  6. zhlan--Python中的字典遍历方法 字典取值
  7. 基于BASYS2的VHDL程序——交通灯(状态机版)
  8. 燃烧青春和诗意的IT人生
  9. 一些经常会用到的vbscript检测函数
  10. Win10 + Opencv2.4.9