一,谱聚类原理

谱聚类算法原理可以参考如下链接。

这个视频推导出了拉普拉斯矩阵,但没有更新后续优化问题。

机器学习-白板推导系列(二十二)-谱聚类(Spectral Clustering)_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1kt411X7Zh?from=search&seid=10058510101134916284&spm_id_from=333.337.0.0可以搭配视频笔记食用:

谱聚类 · 语雀 (yuque.com)https://www.yuque.com/books/share/f4031f65-70c1-4909-ba01-c47c31398466/wkk1g3详细及全面讲解参考:

(6条消息) 带你玩转谱聚类及拉普拉斯矩阵_SL_World的博客-CSDN博客https://blog.csdn.net/SL_World/article/details/104423536

(6条消息) 谱聚类(spectral clustering)及其实现详解_yycc-CSDN博客_谱聚类实现https://blog.csdn.net/yc_1993/article/details/52997074

谱聚类是从图论中演化出来的算法,后来在聚类中得到了广泛的应用。

1,构图

谱聚类过程主要有两步,第一步是构图,将采样点数据构造成一张网图,表示为G(V,E),V表示图中的点,E表示点与点之间的边,如下图:

图1 谱聚类构图(来源wiki)

在构图中,一般有三种构图方式:
       1. ε-neighborhood
       2. k-nearest neighborhood
       3. fully connected

2,切图

第二步是切图,即将第一步构造出来的按照一定的切边准则,切分成不同的图,而不同的子图,即我们对应的聚类结果,举例如下:

谱聚类切图存在两种主流的方式:RatioCut和Ncut,目的是找到一条权重最小,又能平衡切出子图大小的边。

二,实现

(一),自写Python实现步骤

参考:谱聚类(Spectral Clustering)原理及Python实现_songbinxu的博客-CSDN博客_谱聚类python代码https://blog.csdn.net/songbinxu/article/details/80838865

0.生成数据(utils/dataloader.py)

from sklearn import datasets
#sklearn 学习参考网址https://zhuanlan.zhihu.com/p/393113910def genTwoCircles(n_samples=1000):X,y = datasets.make_circles(n_samples, factor=0.5, noise=0.05)return X, y
'''datasets.make_circles在2d中创建一个包含较小圆的大圆的样本集factor内圈和外圈之间的比例因子noise高斯噪声的标准偏差加到数据上返回:X生成的样本y每个样本的类成员的整数标签(0或1)
'''

1.距离矩阵(utils/similarity.py)

import numpy as np
#定义欧式距离
def euclidDistance(x1, x2, sqrt_flag=False):res = np.sum((x1-x2)**2)if sqrt_flag:res = np.sqrt(res)return resdef calEuclidDistanceMatrix(X):X = np.array(X)S = np.zeros((len(X), len(X)))for i in range(len(X)):for j in range(i+1, len(X)):S[i][j] = 1.0 * euclidDistance(X[i], X[j])S[j][i] = S[i][j]return S'''np.array:创建数组,array 里的元素都是同一类型返回:S距离矩阵
'''

2.临街矩阵(utils/knn.py)

'''
KNN算法:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别
'''
import numpy as npdef myKNN(S, k, sigma=1.0):N = len(S)#返回矩阵的行数A = np.zeros((N,N))
#下为找xi的K邻近for i in range(N):dist_with_index = zip(S[i], range(N))#矩阵的第i行各个元素,与长度为数字N的tuple(元组)集合,组成列表#[(ai1,0),(ai2,1),,,]dist_with_index = sorted(dist_with_index, key=lambda x:x[0])#按列表的第一个元素升序排列neighbours_id = [dist_with_index[m][1] for m in range(k+1)] # xi's k-nearest neighbours#返回K邻近的列坐标for j in neighbours_id: # xj is xi's neighbourA[i][j] = np.exp(-S[i][j]/2/sigma/sigma)#高斯核函数:随着两个向量的距离增大,高斯核函数单调递减#np.exp=e^xA[j][i] = A[i][j] # mutuallyreturn A
'''A是各个样本的K邻近矩阵,维度:n*n,K邻近有值,其余为0
'''

3. 标准化的拉普拉斯矩阵(utils/laplacian.py)

import numpy as npdef calLaplacianMatrix(adjacentMatrix):# compute the Degree Matrix: D=sum(A)degreeMatrix = np.sum(adjacentMatrix, axis=1)# print degreeMatrix# compute the Laplacian Matrix: L=D-AlaplacianMatrix = np.diag(degreeMatrix) - adjacentMatrix#np.diag:以一维数组的形式返回方阵的对角线# print laplacianMatrix# normailze# D^(-1/2) L D^(-1/2)sqrtDegreeMatrix = np.diag(1.0 / (degreeMatrix ** (0.5)))#**:返回x的y次幂return np.dot(np.dot(sqrtDegreeMatrix, laplacianMatrix), sqrtDegreeMatrix) #np.dot:矩阵乘法#假设A,B为矩阵,A.dot(B)等价于 np.dot(A,B)

4. 特征值分解、5. Kmeans (utils/main.py)

import sys'''首先引入sys模块,sys模块提供了许多函数和变量来处理 Python运行时环境的不同部分sys 模块主要负责与 Python 解释器进行交互,该模块提供了一系列用于控制 Python 运行环境的函数和变量
'''
print(sys.path)
'''查看当前路径增加自定义函数文件的路径,到文件夹位置,路径前面不能少了rsys.path:返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值例如sys.path.append(r"E:\python\workspace\pythonDemo1")
'''
sys.path.append("..")
'''这代表添加当前路径的上一级目录(父目录)再引入文件并调用函数
'''
from utils.similarity import calEuclidDistanceMatrix
from utils.knn import myKNN
from utils.laplacian import calLaplacianMatrix
from utils.dataloader import genTwoCircles
from utils.ploter import plot
from sklearn.cluster import KMeans
import numpy as np'''from .A import B 导入A模块中的B函数或变量import A as a 导入A模块别名a
'''np.random.seed(1)
'''seed( ) 用于指定随机数生成时所用算法开始的整数值。1.如果使用相同的seed( )值,则每次生成的随即数都相同;2.如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。3.设置的seed()值仅一次有效
'''data, label = genTwoCircles(n_samples=500)
# 返回data(生成的样本);label(每个样本的类成员的整数标签0或1)Similarity = calEuclidDistanceMatrix(data)
# 返回Similarity(样本距离矩阵)N*NAdjacent = myKNN(Similarity, k=10)
# 返回A(K邻近矩阵)N*N,将距离转为相似度,K邻近有值,其余为0
Laplacian = calLaplacianMatrix(Adjacent)
# Laplacian:返回拉普拉斯算子运算D^(-1/2) L D^(-1/2)
x, V = np.linalg.eig(Laplacian)
# 计算方形矩阵Laplacian的特征值和特征向量
# x多个特征值组成的一个矢量
# V多个特征向量组成的一个矩阵。
# 每一个特征向量都被归一化了。
# 第i列的特征向量v[:,i]对应第i个特征值x[i]。
x = zip(x, range(len(x)))
# 特征值与序号组成列表
x = sorted(x, key=lambda x: x[0])
# 按列表的第一个元素(特征值)升序排列
H = np.vstack([V[:, i] for (v, i) in x[:500]]).T
# 取最小的500个特征值对应的特征行向量
# 按垂直方向(行顺序)堆叠数组构成一个新的数组,然后转置
sp_kmeans = KMeans(n_clusters=2).fit(H)
# 使用H训练KMeans,聚类为2簇
pure_kmeans = KMeans(n_clusters=2).fit(data)
# 使用原始数据训练KMeans,聚类为2簇
name = ['spectral_clustering','pure_kmeans_clustering']
plot(data, sp_kmeans.labels_, name[0])
plot(data, pure_kmeans.labels_, name[1])
# 画图进行比较

6.画图(utils/ploter.py )

from matplotlib import pyplot as plt
from itertools import cycle, islice
import numpy as np
import sysfrom matplotlib.pyplot import titledef plot(X, y, title):sys.path.append("..")colors = np.array(list(islice(cycle(['#377eb8', '#ff7f00', '#4daf4a', '#f781bf', '#a65628', '#984ea3', '#999999', '#e41a1c', '#dede00']),int(max(y) + 1))))plt.title(title)plt.scatter(X[:, 0], X[:, 1], s=10, color=colors[y])plt.savefig("./utils/figures/"+str(title)+".png")

7.结果图

 

(二)使用sklearn.cluster.SpectralClustering

谱聚类Spectral clustering(SC) – 数据常青藤 (dataivy.cn)https://www.dataivy.cn/blog/%E8%B0%B1%E8%81%9A%E7%B1%BBspectral-clustering/

from sklearn.cluster import SpectralClustering
gamma =0.001
#初始化gamma,也可以加入循环,找最好值
clusterlabel = []
#初始化分组
max = 0
#保存最好的分组
for k in range(2,10):#分K组for j in range(1,20):#j邻居数clustering = SpectralClustering(assign_labels="discretize",random_state=0,n_neighbors=j,n_clusters=k,gamma=gamma).fit(X)# X:你的数据if  metrics.calinski_harabasz_score(X, clustering.labels_) >= max:max = metrics.calinski_harabasz_score(X, clustering.labels_)clusterlabel = clustering.labels_print("n_clusters:", k)print("n_neighbors:", j)print("Calinski-Harabasz Score:", metrics.calinski_harabasz_score(X, clustering.labels_))print('clustering.labels_:', clusterlabel)

Python学习4-谱聚类相关推荐

  1. 谱聚类python代码_Python 谱聚类算法从零开始

    谱聚类算法是一种常用的无监督机器学习算法,其性能优于其他聚类方法. 此外,谱聚类实现起来非常简单,并且可以通过标准线性代数方法有效地求解. 在谱聚类算法中,根据数据点之间的相似性而不是k-均值中的绝对 ...

  2. 小白学习机器学习===谱聚类之NCut切图

    Ncut        Ncut切法实际上与Ratiocut相似,但Ncut把Ratiocut的分母|Ai|换成vol(Ai)(Vol(Ai)表示子集A中所有边的权重之和),这种改变与之而来的,是L的 ...

  3. Python学习 | 2021-11-05 Scipy聚类色彩提取

    目录 一.聚类分析 1.聚类 2.Scipy中的聚类算法(K-Means) 3.聚类示例 完整代码: 运行结果: 函数使用: 二.图像色彩聚类 操作步骤: 完整代码: 运行结果: 三.合并至Flask ...

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

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

  5. python谱聚类算法_谱聚类(spectral clustering)原理总结

    谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也 ...

  6. 三维点云学习(3)8- 实现Spectral谱聚类

    三维点云学习(3)8- 实现Spectral谱聚类 谱聚类代码参考 课堂谱聚类理论笔记 效果图 原图 效果图 前三种为自写的聚类算法,分别是 KMeans.GMM.Spectral,后面为sklear ...

  7. 转:完整的最简单的谱聚类python代码

    http://blog.csdn.net/waleking/article/details/7584084 针对karate_club数据集,做了谱聚类.由于是2-way clustering,比较简 ...

  8. 谱聚类Python代码详解

    谱聚类算法步骤 整体来说,谱聚类算法要做的就是先求出相似性矩阵,然后对该矩阵归一化运算,之后求前个特征向量,最后运用K-means算法分类. 实际上,谱聚类要做的事情其实就是将高维度的数据,以特征向量 ...

  9. Python计算机视觉编程第六章——图像聚类(K-means聚类,DBSCAN聚类,层次聚类,谱聚类,PCA主成分分析)

    Python计算机视觉编程 图像聚类 (一)K-means 聚类 1.1 SciPy 聚类包 1.2 图像聚类 1.1 在主成分上可视化图像 1.1 像素聚类 (二)层次聚类 (三)谱聚类 图像聚类 ...

最新文章

  1. Java使用Maven加载redis.clients连接Redis
  2. 「技术综述」如何降低遮挡对人脸识别的影响
  3. ad中电容用什么封装_干货 | 为什么单相电机要用电容,三相电机不需要电容?...
  4. python2.7不换行输出_python输出不换行
  5. abstractset java_AbstractSet源码分析-java8
  6. IIS6注册.net4.0
  7. [AH/HNOI2017]大佬
  8. linux 中断 进程,linux中断分上下部分原因
  9. C++:gloox库进行协议扩展(使用自定义标签)
  10. nginx 限制某些类型的客户端的访问
  11. koa2 中间件里面的next到底是什么
  12. 从青铜到王者,代码人生之路 | 凌云时刻
  13. 理解 Linux 配置文件【转】
  14. Linux系统安装之CentOS7,详细步骤!
  15. 思岚激光雷达A2 Ros配置
  16. 力扣周赛 第282场 Java题解
  17. win10电脑不显示WIFI
  18. pyTorch入门(五)——训练自己的数据集
  19. android 蓝牙连接rtk,基于Android手机的RTK手簿软件设计与实现
  20. JDK的一个Bug,监听文件变更要小心了

热门文章

  1. 13 对发生拷贝数变异的基因进行 KEGG 注释
  2. JS重写函数valueOf方法实现连续调用求和
  3. ISTA 7D包装测试评估运输包装的温度测试。
  4. 1 运筹笔记-随机规划(Stochastic Programming)
  5. Linux下切换cuda版本
  6. 【Charles】小米手机安装证书问题
  7. 职业对口升学计算机英语2016,2016河南对口升学(英语).docx
  8. SpringBoot+OSS+VUE+mybatis-plus 前后端 (前后端 · 素材管理)
  9. UVA 10480 - Sabotage (最大流)
  10. java 取得webcontent_JAVA JSP WebContent