谱聚类算法基于图论,它的起源可以追溯到早期的图分割文献。
不过,直至近年来,受益于计算机计算能力的提升,谱聚类算法才得到了广泛的研究和关注。

谱聚类被广泛应用于图像分割、社交网络分析、推荐系统、文本聚类等领域。
例如,在图像分割中,谱聚类可以有效地将图像划分为背景和前景;
在社交网络分析中,它可以识别出不同的社区结构。

1. 算法概述

谱聚类的基本原理是将数据点视为图中的顶点,根据数据点之间的相似性构建图的边。
它首先计算图的拉普拉斯矩阵的特征向量,然后利用这些特征向量进行聚类。
这种方法能够捕捉到数据的非线性结构,因此在许多应用中表现优异。

所谓拉普拉斯矩阵,是一种用于表示一个图的矩阵形式。
对于给定的一个有\(n\)个顶点的图\(G\),它的拉普拉斯矩阵定义为\(L=D-A\)。
其中\(D\)为图的度矩阵,\(A\)为图的邻接矩阵

2. 创建样本数据

为验证谱聚类的效果,用scikit-learn中的样本生成器创建2个非线性结构的数据集。

from sklearn.datasets import make_moons, make_circles

fig, axes = plt.subplots(nrows=1, ncols=2)
fig.set_size_inches((8, 4)) X_moon, y_moon = make_moons(noise=0.05, n_samples=1000)
axes[0].scatter(X_moon[:, 0], X_moon[:, 1], marker="o", c=y_moon, s=25, cmap=plt.cm.spring) X_circle, y_circle = make_circles(noise=0.05, factor=0.5, n_samples=1000)
axes[1].scatter(X_circle[:, 0], X_circle[:, 1], marker="o", c=y_circle, s=25, cmap=plt.cm.winter) plt.show()


一个交错的月牙形式,一个是同心圆形式,都是很难线性分割的数据集。

3. 模型训练

首先,用默认的参数训练看看效果:

from sklearn.cluster import SpectralClustering

# 定义
regs = [
SpectralClustering(n_clusters=2),
SpectralClustering(n_clusters=2),
] # 训练模型
regs[0].fit(X_moon, y_moon)
regs[1].fit(X_circle, y_circle) fig, axes = plt.subplots(nrows=1, ncols=2)
fig.set_size_inches((8, 4)) # 绘制聚类之后的结果
axes[0].scatter(
X_moon[:, 0], X_moon[:, 1], marker="o", c=regs[0].labels_, s=25, cmap=plt.cm.spring
) axes[1].scatter(
X_circle[:, 0], X_circle[:, 1], marker="o", c=regs[1].labels_, s=25, cmap=plt.cm.winter
) plt.show()


从图中可以看出,聚类的效果不是很好,从颜色上看,与原始数据的类别相比差距较大。

接下来,调整下SpectralClustering模型的affinity参数,
这个参数的作用是定义数据点之间的相似度矩阵的计算方法。
affinity参数的可选值常用的有两个:

  1. nearest_neighbors:通过计算最近邻图来构建亲和矩阵
  2. rbf:使用径向基函数 (RBF) 内核构建亲和矩阵。

默认的值是 rbf,下面我们试试nearest_neighbors方式的聚类效果。
将上面的代码中 regs 的定义部分换成如下代码:

regs = [
SpectralClustering(n_clusters=2, affinity="nearest_neighbors"),
SpectralClustering(n_clusters=2, affinity="nearest_neighbors"),
]


修改参数之后的聚类效果与原始数据就非常接近了。

4. 总结

简而言之,谱聚类是一个在图上进行聚类的方法,它试图找到图的最佳切割,使得同一簇内的边的权重尽可能大,而不同簇之间的边的权重尽可能小。

这种聚类算法的优势有:

  1. 可以捕获数据的非线性结构
  2. 对噪声和异常值相对鲁棒
  3. 不需要明确的形状假设,适用于各种形状的簇

它的局限性有:

  1. 计算复杂度相对较高,尤其是对于大规模数据
  2. 需要提前确定簇的数量,这在很多实际应用中是一个挑战
  3. 对于高维数据,可能存在“维度诅咒”问题,尽管可以通过降维缓解,但增加了计算复杂度

【scikit-learn基础】--『监督学习』之 谱聚类的更多相关文章

  1. Python基础『一』

    内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...

  2. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  3. 『cs231n』计算机视觉基础

    线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...

  4. 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支

    下图Github地址:Mask_RCNN       Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...

  5. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  6. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  7. app外包开发注意事项大全『最新』

    随着移动互联网的高速发展,很多互联网创业公司或传统向互联网转型的公司都急需发开一款app软件,多数公司会选择让外包公司来开发.问题来了,App外包市场鱼龙混杂,我们要如何在这里面选择一个靠谱的公司,这 ...

  8. [日推荐] 『Streeter』极乐商店邀你一起来尬舞啊!-store.dreawer.com

    你听的舞蹈有哪些?Jazz?Poppin?Hiphop?现代舞?民族舞?... 今天推荐一款小程序『Streeter』,几乎包含所有舞蹈视频,偷偷学好了,邀请你来尬舞啊 Streeter 这个Logo ...

  9. 『TensorFlow』专题汇总

    TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...

  10. 『TensorFlow』批处理类

    『教程』Batch Normalization 层介绍 基础知识 下面有莫凡的对于批处理的解释: fc_mean,fc_var = tf.nn.moments( Wx_plus_b, axes=[0] ...

随机推荐

  1. 2023年奔走的总结---吉特日化MES 项目趣事 篇一

    终于又到了2023年的年末了,既有兴奋也有遗憾,兴奋的是这难熬的一年马上就要过去了,遗憾的是今年好像没有做成太多的事情.差不多180次的大交通记录,也再次刷新了奔走的记录,忙忙碌碌兜兜转转又去了不少地 ...

  2. [AGC024F] Simple Subsequence Problem

    Problem Statement You are given a set $S$ of strings consisting of 0 and 1, and an integer $K$. Find ...

  3. 解决OpenCV3+VS2015(VS2017)运行时出现debug error abort()has been called的问题

    问题描述: 在windows平台上安装opencv后,测试一张图片时,出现了debug error abort()has been called的问题 环境: vs2015 windows 10 op ...

  4. LeetCode54、59:螺旋矩阵|、||(递归,模拟)

    解题思路:定义一个方向数组,用栈或者直接从左上角的起点进行DFS,如果碰到下一步无法访问,调整方向,继续遍历,直到所有元素都访问了. (这道题好有历史感,到现在还记得我读大一的时候参加院队培训的时候做 ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (164)-- 算法导论13.1 4题

    四.用go语言,假设将一棵红黑树的每一个红结点"吸收"到它的黑色父结点中,使得红结点的子结点变成黑色父结点的子结点(忽略关键字的变化).当一个黑结点的所有红色子结点都被吸收后,它可 ...

  6. 将微服务注册到nacos中

    将微服务注册到nacos中将微服务注册到nacos中 首先修改pom文件,引入nacos依赖,名为spring-cloud-starter-nacos-discovery <dependency ...

  7. python异步编程之asyncio初识

    async await介绍 用asyncio提供的@asyncio.coroutine可以把一个生成器标记为协程类型,然后在协程内部用yield from 等待IO操作,让出cpu执行权. 然而异步的 ...

  8. Codeforce Round 916(div3)

    Codeforces Round 916(div3) [Problem - A - Codeforces]:Problemsolving Log A.题 直接看样例进行分析,发现每一次出现的字符代表着 ...

  9. Python——第二章:文件操作

    文件操作 1. 找到这个文件. 双击打开它 open(文件路径, mode="", encoding="") 文件路径: 1. 绝对路径 d:/test/xxx ...

  10. Vue 2 和 Vue 3 中 toRefs的区别

    摘要:本文将介绍 Vue 2 和 Vue 3 中 toRefs 函数的不同用法和行为,并解释其在各个版本中的作用. 正文: Vue 是一款流行的 JavaScript 框架,用于构建用户界面.在 Vu ...