谱聚类原理:

是一种基于图论的聚类方法!!简而言之,它将带权无向图划分为两个或两个以上的最优子图,使子图内部相似,而子图间相异,依然是很正统的聚类思想。但这个思想乍看很简单,主要有两个问题:怎么度量相似?度量之后又如何进行划分?

相似度度量:
普通的kNN度量方法?相近则权重大,相远则权重小。不过在实际应用中往往采用的全链接方法,即利用高斯分布来进行权重的赋予。

划分策略:
一个直观的想法就是,使划分成的子图内部相似度最大,子图之间的相似度最小。那么自然可以得到划分的损失函数:cut(A1,A2,...Ak)=12∑i=1kW(Ai,A‾i),其中W是相似度权重矩阵cut(A_1,A_2,...A_k) = \frac{1}{2}\sum\limits_{i=1}^{k}W(A_i, \overline{A}_i ),其中W是相似度权重矩阵cut(A1,A2,...Ak)=21i=1kW(Ai,Ai)W

A‾\overline{A}A是A的补集。那么直接使这个函数值最小即可。但这种方法需要对每个子图的规模做出限定,需要遍历所有的可能切分进行相似度计算,于是RatioCut,Ncut等优化切分方法就出现了。

1.RatioCut:最小化损失函数的同时,最大化每个子图的个图总数,考虑划分平衡。于是划分为两个子图的损失函数就变为:RatioCut(A1,A2,...Ak)=12∑i=1kW(Ai,A‾i)∣Ai∣RatioCut(A_1,A_2,...A_k) = \frac{1}{2}\sum\limits_{i=1}^{k}\frac{W(A_i, \overline{A}_i )}{|A_i|}RatioCut(A1,A2,...Ak)=21i=1kAiW(Ai,Ai)
那么如何最小化这个式子?图论中有一个拉普拉斯定理(这在图卷积任务上会有很重要的作用):fTLf=fTDf−fTWf=12∑i,j=1nwij(fi−fj)2,其中D是点的度矩阵f^TLf = f^TDf - f^TWf = \frac{1}{2}\sum\limits_{i,j=1}^{n}w_{ij}(f_i-f_j)^2,其中D是点的度矩阵fTLf=fTDffTWf=21i,j=1nwij(fifj)2D
由此我们可以令hj=1∣Aj∣作为一个指示向量h_{j}= \frac{1}{\sqrt{|A_j|}}作为一个指示向量hj=Aj

1,然后进行化简得到:
RatioCut(A1,A2,...Ak)=12∑i=1kW(Ai,A‾i)∣Ai∣=∑i=1khiTLhi=∑i=1k(HTLH)iiRatioCut(A_1,A_2,...A_k) = \frac{1}{2}\sum\limits_{i=1}^{k}\frac{W(A_i, \overline{A}_i )}{|A_i|} = \sum\limits_{i=1}^{k}h_i^TLh_i = \sum\limits_{i=1}^{k}(H^TLH)_{ii}RatioCut(A1,A2,...Ak)=21i=1kAiW(Ai,Ai)=i=1khiTLhi=i=1k(HTLH)ii
然后怎么继续化简呢?由线性代数我们可以知道,若LH=λHLH=\lambda HLH=λH,即λ\lambdaλ为它的特征值,然后对该式两边左乘一个HTH^THT,可得HTLH=λHTHH^TLH=\lambda H^THHTLH=λHTH,而HTH=IH^TH=IHTH=I,故该式就是矩阵的特征值之和–了。
RatioCut(A1,A2,...Ak)=tr(HTLH)RatioCut(A_1,A_2,...A_k) = tr(H^TLH)RatioCut(A1,A2,...Ak)=tr(HTLH)
哇,然后再次感觉似乎很简单了,最小化cut等于最小化这个迹就行。但是同样的最小化这个矩阵的迹也很困难,还是需要对所有的点的进行划不划分的判断,即2n2^n2n种可能性。所以我们只能退而求其次,找到最小的k个矩阵特征值进行拟合逼近,这样就最小化了这个式子。但是这样做的后果是丢失了一些信息,结果可能会有偏差,所以最后还需要使用K-Means聚类之类的聚类方法对少数的特征进行聚类。

所以谱聚类的算法就变成了算各种矩阵之后,选出最小的k个特征向量,一般需要做个标准化后变成一个特征矩阵,再对这个矩阵进行一次简单的聚类就ok了。(在GCN中由于k个特征值很难计算,所以又进行了傅里叶滤波和切比雪夫多阶逼近的方法。)

什么是谱?
矩阵特征值。

2.Ncut:单凭数量没什么说服力,该点的重要程度,其连通性复杂性应该被重视。所以用点的度矩阵也许效果更好。此时损失函数变为:NCut(A1,A2,...Ak)=12∑i=1kW(Ai,A‾i)vol(Ai),其中vol(Ai)是度矩阵NCut(A_1,A_2,...A_k) = \frac{1}{2}\sum\limits_{i=1}^{k}\frac{W(A_i, \overline{A}_i )}{vol(A_i)},其中vol(A_i)是度矩阵NCut(A1,A2,...Ak)=21i=1kvol(Ai)W(Ai,Ai)vol(Ai)
求解方法与思路基本没什么区别,只是L变成了D−1/2LD−1/2了D^{-1/2}LD^{-1/2}D1/2LD1/2(又称归一化)而已,计算速度上会稍稍的快一点。

SC应用:
SpectralClustering参数说明:
SpectralClustering(affinity=‘nearest_neighbors’, assign_labels=‘kmeans’,coef0=1, degree=3, eigen_solver=‘arpack’, eigen_tol=0.0,gamma=1.0, kernel_params=None, n_clusters=2, n_init=10, n_jobs=1,n_neighbors=10, random_state=None)

affinity='nearest_neighbors',:相似度度量方式
assign_labels='kmeans':最后聚类方式的选择
coef0=1:核函数,对应affinity的某些需要
degree=3:核函数,对应affinity的某些需要
eigen_solver='arpack':降维时的工具
eigen_tol=0.0:停止条件
gamma=1.0,:核函数,对应affinity的某些需要
kernel_params=None:自定义核函数
n_clusters=2:切分时的k个特征向量
n_init=10:赋不同初值的次数阈值
n_neighbors=10:affinity中的k

利用sklearn做谱聚类:

基本代码很简单就不贴了,可以参照之前其他篇章内的代码稍作修改即可。仅贴出数据集。

#数据点
X,noisy_circles = datasets.make_circles(n_samples=1500, factor=.5,noise=.05)


其他聚类(基于网格,模型,模糊,概率聚类等)

基于网格的方法(grid-based methods):

网格方法是空间数据处理中常用的将空间数据离散化的方法。它将对象空间量化成有限数目的单元,这些网格形成了网格结构,所有的聚类结构都在该结构上进行。跟层次聚类一样,它也有从上到下和从下到上两种形态,其思想也大致差不多。从下到上的的代表性算法是 WaveClusterCLIQUE。从上到下主要有OptiGridCLTree。而网格法的主要优点是处理速度快,易于增量实现,并行处理和善于进行高维数据处理。

STING也是一种基于网格的多分辨率的聚类技术,采用了多分辨率的方法。但是聚类的质量取决于网格结构的最低层的粒度,时间VS精度。

基于模型的方法(model-based methods):
基于模型的方法给每一个聚类假定一个模型,然后去寻找能一个很好的满足这个模型的数据集。这样一个模型可能是数据点在空间中的密度分布函数或者其它。有一些像是**EM算法,蒙特卡洛,基于神经网络的SOON以及各种混合算法**。

而且到目前为止,单维聚类方法已经不再适合大数据的多样性特征,只有多维聚类分析通过对单维聚类问题的扩展,才能为复杂数据提供了一种新的探索性分析的方式。

模糊聚类分析
在现实生活中,有些事情是午饭完全的得到答案的,有时候往往十分的模糊,为了避免非此即彼的分类造成比较大的疏漏,就出现了以模糊数学为基础的聚类分析。模糊聚类分析就是是根据客观事物间的特征、亲疏程度、相似性,通过建立模糊相似关系对客观事物进行聚类的分析方法。

FCM算法是一种以隶属度来确定每个数据点属于某个聚类程度的算法。通过建立模糊相似矩阵,初始化隶属矩阵不断迭代收敛, 最后由隶属矩阵来确定数据所属的类。

模糊 K 均值聚类模糊 K 均值聚类算法是 K 均值聚类的扩展,它的基本原理和 K 均值一样,只是它的聚类结果允许存在对象属于多个簇,模糊 K 均值也是在待聚类对象向量集合上循环,但是它并不是将向量分配给距离最近的簇,而是计算向量与各个簇的相关性(Association)。假设有一个向量 v,有 k 个簇,v 到 k 个簇中心的距离分别是 d1,d2… dk,那么 V 到第一个簇的相关性 u1可以通过下面的算式计算:

计算 v 到其他簇的相关性只需将 d1替换为对应的距离。从上面的算式,我们看出,当 m 近似 2 时,相关性近似 1;当 m 近似 1 时,相关性近似于到该簇的距离,所以 m 的取值在(1,2)区间内,当 m 越大,模糊程度越大,m 就是模糊参数。

基于概率分布模型
Dirichlet Processes Clustering

聚类算法大应用:

import time#用于比较算法之间的时间
import warningsimport numpy as np
import matplotlib.pyplot as pltfrom sklearn import cluster, datasets, mixture
from sklearn.neighbors import kneighbors_graph
from sklearn.preprocessing import StandardScaler
from itertools import cycle, islicenp.random.seed(0)#多种不同的数据形态
n_samples = 1500
noisy_circles = datasets.make_circles(n_samples=n_samples, factor=.5,noise=.05)
noisy_moons = datasets.make_moons(n_samples=n_samples, noise=.05)
blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)
no_structure = np.random.rand(n_samples, 2), None#变换
random_state = 170
X, y = datasets.make_blobs(n_samples=n_samples, random_state=random_state)
transformation = [[0.6, -0.6], [-0.4, 0.8]]
X_aniso = np.dot(X, transformation)
aniso = (X_aniso, y)varied = datasets.make_blobs(n_samples=n_samples,cluster_std=[1.0, 2.5, 0.5],random_state=random_state)#切分结构图
plt.figure(figsize=(9 * 2 + 3, 12.5))
plt.subplots_adjust(left=.02, right=.98, bottom=.001, top=.96, wspace=.05,hspace=.01)plot_num = 1#基础缺省值
default_base = {'quantile': .3,'eps': .3,'damping': .9,'preference': -200,'n_neighbors': 10,'n_clusters': 3}datasets = [(noisy_circles, {'damping': .77, 'preference': -240,'quantile': .2, 'n_clusters': 2}),(noisy_moons, {'damping': .75, 'preference': -220, 'n_clusters': 2}),(varied, {'eps': .18, 'n_neighbors': 2}),(aniso, {'eps': .15, 'n_neighbors': 2}),(blobs, {}),(no_structure, {})]#对每种不同的数据集
for i_dataset, (dataset, algo_params) in enumerate(datasets):params = default_base.copy()params.update(algo_params)X, y = dataset#数据标准化X = StandardScaler().fit_transform(X)#某些算法特有参数bandwidth = cluster.estimate_bandwidth(X, quantile=params['quantile'])connectivity = kneighbors_graph(X, n_neighbors=params['n_neighbors'], include_self=False)connectivity = 0.5 * (connectivity + connectivity.T)#各类算法模型们ms = cluster.MeanShift(bandwidth=bandwidth, bin_seeding=True)two_means = cluster.MiniBatchKMeans(n_clusters=params['n_clusters'])ward = cluster.AgglomerativeClustering(n_clusters=params['n_clusters'], linkage='ward',connectivity=connectivity)spectral = cluster.SpectralClustering(n_clusters=params['n_clusters'], eigen_solver='arpack',affinity="nearest_neighbors")dbscan = cluster.DBSCAN(eps=params['eps'])affinity_propagation = cluster.AffinityPropagation(damping=params['damping'], preference=params['preference'])average_linkage = cluster.AgglomerativeClustering(linkage="average", affinity="cityblock",n_clusters=params['n_clusters'], connectivity=connectivity)birch = cluster.Birch(n_clusters=params['n_clusters'])gmm = mixture.GaussianMixture(n_components=params['n_clusters'], covariance_type='full')clustering_algorithms = (('MiniBatchKMeans', two_means),('AffinityPropagation', affinity_propagation),('MeanShift', ms),('SpectralClustering', spectral),('Ward', ward),('AgglomerativeClustering', average_linkage),('DBSCAN', dbscan),('Birch', birch),('GaussianMixture', gmm))for name, algorithm in clustering_algorithms:t0 = time.time()# catch warningswith warnings.catch_warnings():warnings.filterwarnings("ignore",message="the number of connected components of the " +"connectivity matrix is [0-9]{1,2}" +" > 1. Completing it to avoid stopping the tree early.",category=UserWarning)warnings.filterwarnings("ignore",message="Graph is not fully connected, spectral embedding" +" may not work as expected.",category=UserWarning)algorithm.fit(X)t1 = time.time()if hasattr(algorithm, 'labels_'):y_pred = algorithm.labels_.astype(np.int)else:y_pred = algorithm.predict(X)plt.subplot(len(datasets), len(clustering_algorithms), plot_num)if i_dataset == 0:plt.title(name, size=18)colors = np.array(list(islice(cycle(['#377eb8', '#ff7f00', '#4daf4a','#f781bf', '#a65628', '#984ea3','#999999', '#e41a1c', '#dede00']),int(max(y_pred) + 1))))plt.scatter(X[:, 0], X[:, 1], s=10, color=colors[y_pred])plt.xlim(-2.5, 2.5)plt.ylim(-2.5, 2.5)plt.xticks(())plt.yticks(())plt.text(.99, .01, ('%.2fs' % (t1 - t0)).lstrip('0'),transform=plt.gca().transAxes, size=15,horizontalalignment='right')plot_num += 1plt.show()

从上图可以对不同的聚类算法的运行时间有直观的认识,而且对于他们适用的形状集也能有大致的了解。

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. 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. 【论文阅读和实现】On Spectral Clustering: Analysis and an algorithm【Python实现】

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

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

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

最新文章

  1. 为rm添加一个回收站|将linux下的rm命令改造成mv到指定的目录下
  2. C++ 虚函数、多态
  3. GraphQL 入门第一篇
  4. 合并石子(信息学奥赛一本通-T1274)
  5. 图解匈牙利算法(含python代码)
  6. 拷贝一个用户下的所有表和数据到另外一个库
  7. 笔记本电脑怎么清理灰尘_笔记本电脑卡顿,运行慢,似中病毒,看这里 小白教你轻松搞定...
  8. Oracle书籍推荐
  9. linux 交叉编译器作用,Linux下交叉编译器学习
  10. 神经网络如何利用C语言实现动画?
  11. Freesurfer recon-all命令详解及使用示例
  12. 抖音微信消息推送情侣告白浪漫(简易版)
  13. pdps修改服务器,Tecnomatix PDPS二次开发功能介绍
  14. python读取加密word_Python 实现加密过的PDF文件转WORD格式
  15. 微信群控服务器一体机,群控和微信群控,你了解多少?
  16. Solaris 11中配置基于link的IPMP
  17. python 异或两个文件
  18. 集中合同管理与分散合同管理
  19. 关于技术规划、管理、架构的思考
  20. 武汉地图json文件_echarts各省市地图js和json文件

热门文章

  1. iOS 接入 招商 一网通的 各种坑
  2. Nginx学习笔记(反向代理搭建集群)
  3. 微信叫车系统|顺风车小程序|在线选座拼车订票APP【开发实战】
  4. 20160226.CCPP体系详解(0036天)
  5. ipad投影到mac上_如何停止Mac和iPad上的来电
  6. 51单片机之共阳数码管
  7. 批量删除多个 PDF 文档空白页
  8. Cesium场景泛光
  9. 深度学习能力非常重要!
  10. pdf转json_如何显著缩小PDF文件大小?