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

谱聚类

通过对样本数据的拉普拉斯矩阵特征向量进行聚类,从而达到对样本数据进行聚类的目的;其本质是将聚类问题转换为图的最优划分问题,是一种点对聚类算法。

谱聚类算法将数据集中的每个对象看做图的顶点 V,将顶点间的相似度量化为相应顶点连接边E的权值 w,这样就构成了一个基于相似度的无向加权图 G(V,E),于是聚类问题就转换为图的划分问题。基于图的最优划分规则就是子图内的相似度最大,子图间的相似度最小

步骤
谱聚类的构建过程主要包含以下几个步骤

  • 构建表示对象相似度的矩阵 W
  • 构建度矩阵 D(对角矩阵)
  • 构建拉普拉斯矩阵 L(有个特点:行累加=0)
  • 计算矩阵L的前 k 个特征值的特征向量(k 个列向量)
  • 将k个列向量组成矩阵 U (Un×k)\quad \left( U_{n×k}\right)(Un×k​)
  • 对矩阵 U 中的 n 行数据利用 K-means 或其它经典聚类算法进行聚类得出最终结果

拉普拉斯矩阵及变形
W=(wij)i,j=1,...,nW=(w_{ij}) \quad i,j=1,...,nW=(wij​)i,j=1,...,n

D=(∑i=1nw1j000⋮⋱⋮⋮00∑i=1nwij0000∑i=1nwnj)D= \begin{pmatrix} \sum_{i=1}^n w_{1j} & 0 & 0 & 0 \\ \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & \sum_{i=1}^n w_{ij} & 0\\ 0 & 0 & 0 & \sum_{i=1}^n w_{nj} \end{pmatrix}D=⎝⎜⎜⎜⎛​∑i=1n​w1j​⋮00​0⋱00​0⋮∑i=1n​wij​0​0⋮0∑i=1n​wnj​​⎠⎟⎟⎟⎞​

L=D−WL=D-WL=D−W

  • 拉普拉斯矩阵(算法默认使用的是拉普拉斯矩阵)
    L=D−WL=D-WL=D−W
  • 对称拉普拉斯矩阵
    Lsym=D−12(D−W)D−12=I−D−12WD−12L_{sym}=D^{−\frac{1}{2}} (D−W) D^{−\frac{1}{2}}=I−D^{−\frac{1}{2}} WD^{−\frac{1}{2}}Lsym​=D−21​(D−W)D−21​=I−D−21​WD−21​
  • 随机游走拉普拉斯矩阵
    Lrw=D−1(D−W)L_rw=D^{−1} (D−W)Lr​w=D−1(D−W)

应用场景
图形聚类、计算机视觉、非凸球形数据聚类等

面临的问题

  • 相似度矩阵的构建问题(比较难):业界一般使用高斯相似函数或者k近邻来作为相似度量,一般建议 使用k近邻的方式来计算相似度权值
  • 聚类数目的给定
  • 如何选择特征向量(矩阵一大,求特征向量的难度会比较高)
  • 如何提高谱聚类的执行效率

代码实现

使用scikit的相关API创建模拟数据,然后使用谱聚类算法进行数据聚类操作,并比较算法在不同参数情况下的聚类效果。

API

sklearn.cluster.spectral_clustering(affinity, n_clusters=8, n_components=None, eigen_solver=None, random_state=None, n_init=10, eigen_tol=0.0, assign_labels=‘kmeans’)

参数

  • affinity:相似度矩阵构建方式
  • assign_labels:上面说的U的构建方式

代码

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import sklearn.datasets as ds
import matplotlib.colors
import warnings
from sklearn.cluster import spectral_clustering#引入谱聚类
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import euclidean_distances## 设置属性防止中文乱码及拦截异常信息
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = Falsewarnings.filterwarnings('ignore', category=FutureWarning)### 创建模拟数据
N = 1000
centers = [[1, 2], [-1, -1], [1, -1], [-1, 1]]
#符合高斯分布的数据集
data1, y1 = ds.make_blobs(N, n_features=2, centers=centers, cluster_std=(0.75,0.5,0.3,0.25), random_state=0)
data1 = StandardScaler().fit_transform(data1)
dist1 = euclidean_distances(data1, squared=True)
# 权重计算公式
affinity_params1 = map(lambda x: (x,np.exp(-dist1 ** 2 / (x ** 2)) + 1e-6), np.logspace(-2,0,6))# 数据2
#圆形数据集
t = np.arange(0, 2 * np.pi, 0.1)
data2_1 = np.vstack((np.cos(t), np.sin(t))).T
data2_2 = np.vstack((2*np.cos(t), 2*np.sin(t))).T
data2_3 = np.vstack((3*np.cos(t), 3*np.sin(t))).T
data2 = np.vstack((data2_1, data2_2, data2_3))
y2 = np.vstack(([0] * len(data2_1), [1] * len(data2_2), [2] * len(data2_3)))
## 数据2的参数
dist2 = euclidean_distances(data2, squared=True)
affinity_params2 = map(lambda x: (x, np.exp(-dist2 ** 2 / (x ** 2)) + 1e-6), np.logspace(-2,0,6))datasets = [(data1, y1, affinity_params1), (data2, y2, affinity_params2)]def expandBorder(a, b):d = (b - a) * 0.1return a-d, b+d
colors = ['r', 'g', 'b', 'y']
cm = mpl.colors.ListedColormap(colors)for i,(X, y, params) in enumerate(datasets):x1_min, x2_min = np.min(X, axis=0)x1_max, x2_max = np.max(X, axis=0)x1_min, x1_max = expandBorder(x1_min, x1_max)x2_min, x2_max = expandBorder(x2_min, x2_max)n_clusters = len(np.unique(y))plt.figure(figsize=(12, 8), facecolor='w')plt.suptitle(u'谱聚类--数据%d' % (i+1), fontsize=20)plt.subplots_adjust(top=0.9,hspace=0.35)for j,param in enumerate(params):sigma,af = param#谱聚类的建模## af: 指定相似度矩阵构造方式(就是相似度矩阵)y_hat = spectral_clustering(af, n_clusters=n_clusters, assign_labels='kmeans', random_state=28)unique_y_hat = np.unique(y_hat)n_clusters = len(unique_y_hat) - (1 if -1 in y_hat else 0)print ("类别:",unique_y_hat,";聚类簇数目:",n_clusters)## 开始画图plt.subplot(3,3,j+1)for k, col in zip(unique_y_hat, colors):cur = (y_hat == k)plt.scatter(X[cur, 0], X[cur, 1], s=40, c=col, edgecolors='k')plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)plt.title('$\sigma$ = %.2f ,聚类簇数目:%d' % (sigma, n_clusters), fontsize=16)plt.subplot(3,3,7)plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=cm, edgecolors='none')plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.title('原始数据,聚类簇数目:%d' % len(np.unique(y)))plt.grid(True)plt.show()

类别: [0 1 2 3] ;聚类簇数目: 4
类别: [0 1 2 3] ;聚类簇数目: 4
类别: [0 1 2 3] ;聚类簇数目: 4
类别: [0 1 2 3] ;聚类簇数目: 4
类别: [0 1 2 3] ;聚类簇数目: 4
类别: [0 1 2 3] ;聚类簇数目: 4

类别: [0 1 2] ;聚类簇数目: 3
类别: [0 1 2] ;聚类簇数目: 3
类别: [0 1 2] ;聚类簇数目: 3
类别: [0 1 2] ;聚类簇数目: 3
类别: [0 1 2] ;聚类簇数目: 3
类别: [0 1 2] ;聚类簇数目: 3


上面提到“affinity:相似度矩阵构建方式”,可以使用高斯(相似度矩阵的构建问题,业界一般使用高斯相似函数或者k近邻来作为相似度量。)σ是高斯相似函数中的值

机器学习(聚类十)——谱聚类及代码实现相关推荐

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

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

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

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

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

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

  4. sklearn聚类之谱聚类SpectralClustering

    文章目录 基本原理 sklearn中谱聚类的构造 实战 基本原理 谱聚类是一种基于图论的聚类方法,所谓图,就是将空间中的所有点连接起来,只要这些连接中出现了一个圈,就可以称之为图.如果把这些连线加上一 ...

  5. 关于距离,K-means,层次聚类,密度聚类以及谱聚类

    目录 相似度/距离 k-Means算法 衡量聚类(轮廓系数) 层次聚类 密度聚类 谱聚类 之前博客中讲的模型基本上都是分类以及回归模型,他们都是属于有监督学习的,意为所有的样本都有一个结果值提供,我们 ...

  6. K-Means算法、层次聚类、密度聚类及谱聚类方法详述

    1.聚类算法概述 (1)什么是聚类? 聚类就是对大量未知标注的数据集,按照数据内部存在的数据特征将数据集划分为多个不同的类别,使类别内的数据比较相似,类别之间的数据相似度比较小,属于无监督学习. 聚类 ...

  7. 了解聚类是什么。聚类方法:k-means、核聚类、层次聚类、谱聚类

    聚类 1.什么是聚类 2.聚类方法 2.1 划分式聚类方法 k-means k-means++ bi-kmeans 基于密度的方法 DBSCAN OPTICS算法 层次化聚类算法 核聚类 支持向量聚类 ...

  8. 机器学习笔记六:K-Means聚类,层次聚类,谱聚类

    前面的笔记搞了那么多的数学,这篇来一点轻松的,提前适应一下除了监督问题以外的非监督学习.这篇笔记有没有前面那么多的数学了,要讲的聚类算是无监督的学习方式. 一.一般问题 聚类分析的目标是,创建满足于同 ...

  9. 机器学习笔记十之聚类

    本节目录: 无监督学习 K-均值聚类 优化目标 随机初始化 选择聚类树 1 无监督学习 无监督学习,即让计算机学习无标签数据. 上边的一系列点,没有任何标签信息,我们需要的是找到一个算法,让它为我们找 ...

  10. matlab中有没有谱聚类,matlab – 谱聚类

    首先我必须说我是matlab的新手(以及这个网站--),所以请原谅我的无知. 我正在尝试在matlab中编写一个函数,它将使用Spectral Clustering将一组点分成两个簇. 我的代码如下 ...

最新文章

  1. javascript 正则表达式详解
  2. Chrome 调试 Android WebView 网页
  3. 图像处理基本算法 形状特征
  4. java将一个对象赋值给另一个对象_java一个对象赋值给另一个对象,支持平铺类和层级类间的互转...
  5. clone git 要输入yes_GitHub,git与python连接使用
  6. gpt efi win7 linux,在EFI+GPT硬盘上利用grub2实现Linux/Win7/win8等多重启动
  7. 力扣报错“AddressSanitizer: heap-buffer-overflow on address...”的解决办法
  8. android OpenGL ES实现渲染到透明的纹理 render to transparent texture
  9. HDU1285 确定比赛名次【拓扑排序】
  10. 天然气故障代码大全_天然气燃气表显示的数字代表什么(错误代码办法)
  11. 视频教程-Excel函数教程(下)-Office/WPS
  12. 模电数电高频电路综合实验成套设备QY-MS535G
  13. 小程序搜索框搜索、查询(模糊搜索、关键字查询)
  14. 喜报!易基因“同源基因特异性甲基化时序数据分析方法”获专利授权
  15. UHD X310 MTU 大于1472 windows配置方法
  16. 移动端html5广告的优势,移动端H5广告的互动类型探析
  17. 太空大战--声音与特效
  18. JS/JQuery如何判断文本中是否有繁体字
  19. 【pyhon】理想论坛爬虫1.05版,将读取和写DB分离成两个文件
  20. 【ubuntu】安装vmwaretools后还是不能复制粘贴---实测解决。

热门文章

  1. 【Python中的权限错误:无法访问文件】-- 解决方案
  2. 波数及波数向量(波矢量)
  3. 2020年6月编程语言排行榜:C语言蝉联榜单第一
  4. windows7是计算机硬件吗,Windows7硬件最低配置要求介绍
  5. 基于NXP iMX6ULL 扩展音频解码器 MAX98357A
  6. 微信小程序轮播图设计
  7. 给Mi5刷个原生安卓系统
  8. 钉钉企业内部机器人开发——绑定群聊信息到机器人
  9. sr算法matlab,超分辨率 SRCNN
  10. 谁在押注“脱口秀直播带货”?