【scikit-learn基础】--『监督学习』之 谱聚类
谱聚类算法基于图论,它的起源可以追溯到早期的图分割文献。
不过,直至近年来,受益于计算机计算能力的提升,谱聚类算法才得到了广泛的研究和关注。
谱聚类被广泛应用于图像分割、社交网络分析、推荐系统、文本聚类等领域。
例如,在图像分割中,谱聚类可以有效地将图像划分为背景和前景;
在社交网络分析中,它可以识别出不同的社区结构。
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参数的可选值常用的有两个:
- nearest_neighbors:通过计算最近邻图来构建亲和矩阵
- rbf:使用径向基函数 (RBF) 内核构建亲和矩阵。
默认的值是 rbf,下面我们试试nearest_neighbors方式的聚类效果。
将上面的代码中 regs 的定义部分换成如下代码:
regs = [
SpectralClustering(n_clusters=2, affinity="nearest_neighbors"),
SpectralClustering(n_clusters=2, affinity="nearest_neighbors"),
]

修改参数之后的聚类效果与原始数据就非常接近了。
4. 总结
简而言之,谱聚类是一个在图上进行聚类的方法,它试图找到图的最佳切割,使得同一簇内的边的权重尽可能大,而不同簇之间的边的权重尽可能小。
这种聚类算法的优势有:
- 可以捕获数据的非线性结构
- 对噪声和异常值相对鲁棒
- 不需要明确的形状假设,适用于各种形状的簇
它的局限性有:
- 计算复杂度相对较高,尤其是对于大规模数据
- 需要提前确定簇的数量,这在很多实际应用中是一个挑战
- 对于高维数据,可能存在“维度诅咒”问题,尽管可以通过降维缓解,但增加了计算复杂度
【scikit-learn基础】--『监督学习』之 谱聚类的更多相关文章
- Python基础『一』
内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...
- Python基础『二』
目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...
- 『cs231n』计算机视觉基础
线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...
- 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支
下图Github地址:Mask_RCNN Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...
- Scikit Learn: 在python中机器学习
转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...
- [原创] 【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 ...
- app外包开发注意事项大全『最新』
随着移动互联网的高速发展,很多互联网创业公司或传统向互联网转型的公司都急需发开一款app软件,多数公司会选择让外包公司来开发.问题来了,App外包市场鱼龙混杂,我们要如何在这里面选择一个靠谱的公司,这 ...
- [日推荐] 『Streeter』极乐商店邀你一起来尬舞啊!-store.dreawer.com
你听的舞蹈有哪些?Jazz?Poppin?Hiphop?现代舞?民族舞?... 今天推荐一款小程序『Streeter』,几乎包含所有舞蹈视频,偷偷学好了,邀请你来尬舞啊 Streeter 这个Logo ...
- 『TensorFlow』专题汇总
TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...
- 『TensorFlow』批处理类
『教程』Batch Normalization 层介绍 基础知识 下面有莫凡的对于批处理的解释: fc_mean,fc_var = tf.nn.moments( Wx_plus_b, axes=[0] ...
随机推荐
- python之史上最详细if教程
目录 简单的if语句 关系运算符 if-else语句 if-elif-else语句 使用多个elif代码块 省略else代码块 测试多个if 简单的if语句 if语句,顾名思义就是如果...那么就.. ...
- 3款高评价的.Net开发的WMS系统推荐
本文简介 WMS仓库管理系统是一款专业的仓库管理系统,旨在帮助企业实现仓储管理的智能化.信息化和自动化.通过该系统,企业可以实现对仓库的进货.出货.库存等各个环节的全面把控,提高仓储管理水平,降低运营 ...
- 三菱PLC 轻松数采
目前市面上数采的软件有很多,但是用的最为省力最为简单的就是kepserver了,在kepserver的应用中,有对应的三菱驱动针对于三菱PLC,三菱驱动支持多个Mitsubishi 协议,包括 MEL ...
- 华为ar502H物联网边缘计算网关,在容器内控制/dev/do0开关命令
执行以下命令进行开关do继电开关,可以听见电位器声音. echo -en "\x01" > /dev/do0 echo -en "\x00" > ...
- springboot如何用jar包启动,同时为不同机房设置不同的配置文件
1.首先先把配置文件从jar中抽离 示例代码: <plugin> <groupId>org.apache.maven.plugins</groupId> <a ...
- .NET Conf 2023 Chengdu - 成都会场即将到来!
12月9日 天府之国 不见不散 今年的.NET Conf 2023,中国区首次有两个会场举办Local Event,北京会场12月16日,成都会场12月9日.这是所有中国.NET开发者的节日,成都会场 ...
- python的列表、元组
列表(list):是Python中最常用的数据类型之一,字符串里面包含元素的是 一个个的字符,并且字符串是不可能更改的,然而列表不一样,他的每个元素都 可以是任何python类型,而且是可以被更改的 ...
- MNIST中文手写数字数据识别
MNIST中文手写数字数据识别 实验环境 python=3.7 torch==1.13.1+cu117 torchaudio==0.13.1+cu117 torchvision==0.14.1 数据描 ...
- 快速认识什么是:Kubernetes
每次谈到容器的时候,除了Docker之外,都会说起 Kubernetes,那么什么是 Kubernetes呢?今天就来一起学快速入门一下 Kubernetes 吧!希望本文对您有所帮助. Kubern ...
- 语言模型:GPT与HuggingFace的应用
本文分享自华为云社区<大语言模型底层原理你都知道吗?大语言模型底层架构之二GPT实现>,作者:码上开花_Lancer . 受到计算机视觉领域采用ImageNet对模型进行一次预训练,使得模 ...