一、前述

谱聚类(spectral clustering)是一种基于图论的聚类方法,主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远(或者相似度较低)的两个点之间的边权重值较低而距离较近(或者相似度较高)的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。

二、具体原理

1、优点
谱聚类相较于前面讲到的最最传统的k-means聚类方法,谱聚类又具有许多的优点:

1.只需要待聚类点之间的相似度矩阵就可以做聚类了。

2.对于不规则的数据(或者说是离群点)不是那么敏感。

3.k-means聚类算法比较适合于凸数据集(数据集内的任意两点之间的连线都在该数据集以内,简单理解就是圆形,可能不准确),而谱聚类则比较通用。

2、相关概念

相似度矩阵S的构建

构建相似度的矩阵的过程中,可以使用欧氏距离、余弦相似度、高斯相似度等来计算数据点之间的相似度,选用哪个要根据你自己的实际情况来。不过在谱聚类中推荐使用的是高斯相似度,但是我在我的工程中使用的是余弦相似度。

拉普拉斯矩阵
 它的定义很简单,拉普拉斯矩阵。是度矩阵,也就是相似度矩阵的每一行(或者每一列)加和得到的一个对角矩阵。W就是图的邻接矩阵。

相似矩阵

邻接矩阵它是由任意两点之间的权重值组成的矩阵。通常我们可以自己输入权重,但是在谱聚类中,我们只有数据点的定义,并没有直接给出这个邻接矩阵,那么怎么得到这个邻接矩阵呢?
基本思想是,距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,不过这仅仅是定性,我们需要定量的权重值。一般来说我们可以通过样本点距离度量的相似矩阵来获得邻接矩阵。

构建邻接矩阵的方法有三类。-邻近法,K邻近法和全连接法。

    对于-邻近法,它设置了一个距离阈值,然后用欧式距离度量任意两点和的距离。即相似矩阵的,  然后根据和的大小关系,来定义邻接矩阵如下:

    从上式可见,两点间的权重要不就是,要不就是0,没有其他的信息了。距离远近度量很不精确,因此在实际应用中,我们很少使用-邻近法。

    第二种定义邻接矩阵的方法是K邻近法,利用KNN算法遍历所有的样本点,取每个样本最近的k个点作为近邻,只有和样本距离最近的k个点之间的。但是这种方法会造成重构之后的邻接矩阵W非对称,我们后面的算法需要对称邻接矩阵。为了解决这种问题,一般采取下面两种方法之一:

    第一种K邻近法是只要一个点在另一个点的K近邻中,则保留

    第二种K邻近法是必须两个点互为K近邻中,才能保留

    第三种定义邻接矩阵的方法是全连接法,相比前两种方法,第三种方法所有的点之间的权重值都大于0,因此称之为全连接法。可以选择不同的核函数来定义边权重,常用的有多项式核函数,高斯核函数和Sigmoid核函数。最常用的是高斯核函数RBF,此时相似矩阵和邻接矩阵相同:
    在实际的应用中,使用第三种全连接法来建立邻接矩阵是最普遍的,而在全连接法中使用高斯径向核RBF是最普遍的。

3、算法流程:

               输入:样本集D=,相似矩阵的生成方式, 降维后的维度, 聚类方法,聚类后的维度

    输出: 簇划分

    1) 根据输入的相似矩阵的生成方式构建样本的相似矩阵S

    2)根据相似矩阵S构建邻接矩阵W,构建度矩阵D

    3)计算出拉普拉斯矩阵L

    4)求L的最小的个特征值所各自对应的特征向量

    6) 将特征向量组成维的特征矩阵F

    7)对F中的每一行作为一个维的样本,共n个样本,用输入的聚类方法进行聚类,聚类维数为。

    8)得到簇划分

4、总结

谱聚类算法是一个使用起来简单,但是讲清楚却不是那么容易的算法,它需要你有一定的数学基础。如果你掌握了谱聚类,相信你会对矩阵分析,图论有更深入的理解。同时对降维里的主成分分析也会加深理解。

谱聚类算法的主要优点有:
    1)谱聚类只需要数据之间的相似度矩阵,因此对于处理稀疏数据的聚类很有效。这点传统聚类算法比如K-Means很难做到
    2)由于使用了降维,因此在处理高维数据聚类时的复杂度比传统聚类算法好
谱聚类算法的主要缺点有:
    1)如果最终聚类的维度非常高,则由于降维的幅度不够,谱聚类的运行速度和最后的聚类效果均不好。
    2) 聚类效果依赖于相似矩阵,不同的相似矩阵得到的最终聚类效果可能很不同。

三、代码

# !/usr/bin/python
# -*- coding:utf-8 -*-import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
from sklearn.cluster import spectral_clustering
from sklearn.metrics import euclidean_distancesdef expand(a, b):d = (b - a) * 0.1return a-d, b+dif __name__ == "__main__":matplotlib.rcParams['font.sans-serif'] = [u'SimHei']matplotlib.rcParams['axes.unicode_minus'] = Falset = np.arange(0, 2*np.pi, 0.1)data1 = np.vstack((np.cos(t), np.sin(t))).Tdata2 = np.vstack((2*np.cos(t), 2*np.sin(t))).Tdata3 = np.vstack((3*np.cos(t), 3*np.sin(t))).Tdata = np.vstack((data1, data2, data3))n_clusters = 3m = euclidean_distances(data, squared=True)sigma = np.median(m)plt.figure(figsize=(12, 8), facecolor='w')plt.suptitle(u'谱聚类', fontsize=20)clrs = plt.cm.Spectral(np.linspace(0, 0.8, n_clusters))for i, s in enumerate(np.logspace(-2, 0, 6)):print(s)af = np.exp(-m ** 2 / (s ** 2)) + 1e-6y_hat = spectral_clustering(af, n_clusters=n_clusters, assign_labels='kmeans', random_state=1)plt.subplot(2, 3, i+1)for k, clr in enumerate(clrs):cur = (y_hat == k)plt.scatter(data[cur, 0], data[cur, 1], s=40, c=clr, edgecolors='k')x1_min, x2_min = np.min(data, axis=0)x1_max, x2_max = np.max(data, axis=0)x1_min, x1_max = expand(x1_min, x1_max)x2_min, x2_max = expand(x2_min, x2_max)plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)plt.title(u'sigma = %.2f' % s, fontsize=16)plt.tight_layout()plt.subplots_adjust(top=0.9)plt.show()

转载于:https://www.cnblogs.com/LHWorldBlog/p/8728406.html

【机器学习】--谱聚类从初始到应用相关推荐

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

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

  2. 机器学习算法之 K-means、层次聚类,谱聚类

    k-means 和层次聚类都属于划分聚类,实际中最常用的是k-means,k-means效果不好的情况下才会采用其他聚类 K-means算法 K-means算法,也称为K-平均或者K-均值,是一种使用 ...

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

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

  4. 【机器学习】谱聚类(Spectral Clustering)

    疑问 谱聚类的概念 谱聚类是一种针对图结构的聚类方法,将每个点都看作是一个图结构上的点,所以,判断两个点是否属于同一类的依据就是,两个点在图结构上是否有边相连,可以是直接相连也可以是间接相连.本质上就 ...

  5. 机器学习(十一)谱聚类算法

    谱聚类算法 原文地址:http://blog.csdn.net/hjimce/article/details/45749757 作者:hjimce 一.算法概述 谱聚类算法建立在谱图理论基础上,与传统 ...

  6. python谱聚类算法_Python机器学习高级算法!谱聚类(Spectal Clustering)算法分析和实例详解...

    谱聚类(Spectal Clustering)算法是聚类算法的一种,比起传统的K-Means聚类算法,谱聚类算法的效果更优秀,其计算量也小很多,除了谱聚类和K-Means聚类算法,另外还有密度聚类和层 ...

  7. [机器学习]多视角谱聚类(Ncut matlab代码)

    一.多视角   多视角聚类是伴随着信息时代发展过程中人们获取信息的途径日益增加,而逐渐出现的新聚类研究方向.通过多种途径获得的数据其实是对同件事物的不同描述,如电影的图片以及音频都是对这个电影的描述, ...

  8. 机器学习(聚类十)——谱聚类及代码实现

    谱聚类是基于谱图理论基础上的一种聚类方法,与传统的聚类方法相比:具有在任意形状的样本空间上聚类并且收敛于全局最优解的优点.(但效率不高,实际工作中用的比较少) 谱聚类 通过对样本数据的拉普拉斯矩阵的特 ...

  9. 机器学习-常见聚类算法K-means,模糊c-均值,谱聚类 DBSCAN算法等

    聚类算法: 聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法,同时也是数据挖掘的一个重要算法. 聚类(Cluster)分析是由若干模式(Pattern)组成的,通常,模式是一个度量 ...

  10. 【机器学习降维】拉普拉斯矩阵与谱聚类

    文章目录 1.拉普拉斯矩阵 1.1 简介 1.2 性质 2. 瑞利熵 3.广义瑞利熵 4.谱聚类 4. Laplacian Eigenmaps 1.拉普拉斯矩阵 1.1 简介   拉普拉斯矩阵(Lap ...

最新文章

  1. MySQL 通配符学习小结
  2. 在Struts 2中实现文件上传
  3. 基于linux服务器的性能分析与优化
  4. 掌握5个核心要点,做一个高质量的数据分析报告
  5. [HNOI 2011]卡农
  6. system函数和popen函数使用方法
  7. 【C语言简单说】十:小结
  8. python_16(bootstrap)
  9. lodash是否是数组_lodash源码解析:for家族
  10. 深度学习 --- 受限玻尔兹曼机RBM(MCMC接受率详解)
  11. 大型企业网络配置系列课程详解(七) --NAT的配置与相关概念的理解
  12. connection linux refuse telnet_解决telnet无法连接 Connection refused
  13. ie11下下载文件,文件名乱码的解决方法
  14. JavaScript 【99乘法表】【案例】
  15. 罗升阳 android系统源代码情景分析,Android系统源代码情景分析
  16. 平方在c语言程序中怎么表示什么意思,c语言中的平方是怎么表示的?
  17. 基站频谱扫描-高性能扫频仪 TFN FGT720A
  18. idea maven路径总是自己改成默认的路径C:\Users\Ad\.m2\repository
  19. 为年会写的配乐诗朗诵稿
  20. python项目练习四:新闻聚合

热门文章

  1. mysql 查询建表详情_MySQL 查看数据表结构以及详情的方法
  2. 2021-08-3126. 删除有序数组中的重复项 数组
  3. 公式推导 11-21
  4. 基本数据类型及其对应的包装类
  5. php soapclient 超时,PHP SoapClient超时
  6. python中popen阻塞怎么办_对Python subprocess.Popen子进程管道阻塞详解
  7. cacheable中的condition和unless
  8. Graphical Model(概率图模型)的浅见
  9. 【POJ 2279】Mr. Young’s Picture Permutations【线性DP】
  10. slopShell:强大的PHP Webshell