【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] ...
随机推荐
- mysql group by 执行原理及千万级别count 查询优化
大家好,我是蓝胖子,前段时间mysql经常碰到慢查询报警,我们线上的慢sql阈值是1s,出现报警的表数据有 7000多万,经常出现报警的是一个group by的count查询,于是便开始着手优化这块, ...
- 关联规则挖掘:Apriori算法的深度探讨
在本文中,我们深入探讨了Apriori算法的理论基础.核心概念及其在实际问题中的应用.文章不仅全面解析了算法的工作机制,还通过Python代码段展示了具体的实战应用.此外,我们还针对算法在大数据环境下 ...
- com.alibaba.nacos.api.exception.NacosException
具体异常如下: com.alibaba.nacos.api.exception.NacosException: <html><body><h1>Whitelabel ...
- WordPress简码实现的一些常用的效果
首先要确保框架里已经安装好element pro插件,下面是使用简码,来实现效果,在element中找到简码,并且在WordPress后台主题编辑器中,找到function.php文件, 显示产品的分 ...
- vue3在父子组件使用v-model双向绑定
父组件: <script setup> import InputBox from "@/compon/InputBox.vue"; import {ref} from ...
- ASP.NET Core 8 的内存占用可以更低吗?
Maoni Stephens 是 .NET 垃圾回收器 (GC) 的首席架构师之一,她在2023年8月份发表了一篇关于 .NET GC 新功能的博客文章,该功能称为 Dynamic Adaption ...
- WPF中 ContextMenu 寻找父物体的一种方案
据了解 ContextMenu 在WPF中实际是以类似于WIndow的呈现方式,所以 ContextMenu 在当前页面的 Visualtree 中是找不到的. 当在Listbox中需要传递当前选中项 ...
- Using PostMessage/SendMessage to send keys to c# IE WebBrowser
[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool PostM ...
- 开源云原生网关Linux Traefik本地部署结合内网穿透远程访问
开源云原生网关Linux Traefik本地部署结合内网穿透远程访问 前言 Træfɪk 是一个云原生的新型的 HTTP 反向代理.负载均衡软件,能轻易的部署微服务.它支持多种后端 (Docker ...
- 数据库开发实战教程:使用Python连接Kerberos的Presto
[摘要]本文将为大家带来Python连接presto开源的两个实践案例. Python连接presto开源提供了以下两个库可以使用 presto-python-client:https://githu ...