sklearn基础--『无监督学习』之空间聚类

空间聚类算法是数据挖掘和机器学习领域中的一种重要技术。

本篇介绍的基于密度的空间聚类 算法的概念可以追溯到1990年代初期。

随着数据量的增长和数据维度的增加,基于密度的算法逐渐引起了研究者的关注。

其中,DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是最具代表性的算法之一。

基于密度的空间聚类 算法在许多领域都有应用,例如图像处理、生物信息学、社交网络分析等。

在图像处理中,该算法可以用于检测图像中的密集区域,用于识别物体或形状。

1. 算法概述

DBSCAN算法的基本思想是,对于给定的数据集,基于数据点的密度 进行聚类。

在密度高的区域,数据点更为集中,而密度低的区域数据点较为稀疏。

基于密度的算法能够发现任意形状的簇,并且对噪声有较好的鲁棒性。

算法的核心在于:

  1. 定义邻域:对于数据集中的每个点,其邻域是由距离该点在一定半径(通常称为Eps)内的所有点组成的
  2. 定义密度:一个点的密度是其邻域内的点的数量。如果一个点的密度超过某个阈值(通常称为MinPts),则该点被视为核心点
  3. 寻找簇:从每个核心点出发,找到所有密度可达的点,即这些点通过一系列核心点可以与该核心点相连,这些点形成一个簇
  4. 标记噪声点:不属于任何簇的点被标记为噪声点

2. 创建样本数据

下面,创建三种不同的样本数据,来测试DBSCAN的聚类效果。

python 复制代码
from sklearn.datasets import make_blobs, make_moons, make_circles

fig, axes = plt.subplots(nrows=1, ncols=3)
fig.set_size_inches((9, 3))

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,
)

X_blob, y_blob = make_blobs(n_samples=1000, centers=3)
axes[2].scatter(
    X_blob[:, 0],
    X_blob[:, 1],
    marker="o",
    c=y_blob,
    s=25,
    cmap=plt.cm.autumn,
)

plt.show()

3. 模型训练

scikit-learnDBSCAN模型来训练,这个模型主要的参数有两个:

  1. eps (eps):这个参数表示邻域的大小,或者说是邻域的半径。具体来说,对于数据集中的每个点,其 eps-邻域 包含了所有与该点的距离小于或等于 eps 的点。
  2. min_samples (minPts):在给定 eps-邻域内,一个点需要有多少个邻居才能被视为核心点。

通过调节这2个参数,基于上面创建的样本数据,训练效果如下:

python 复制代码
from sklearn.cluster import DBSCAN

# 定义
regs = [
    DBSCAN(min_samples=2, eps=0.1),
    DBSCAN(min_samples=2, eps=0.2),
    DBSCAN(min_samples=3, eps=2),
]

# 训练模型
regs[0].fit(X_moon, y_moon)
regs[1].fit(X_circle, y_circle)
regs[2].fit(X_blob, y_blob)

fig, axes = plt.subplots(nrows=1, ncols=3)
fig.set_size_inches((9, 3))

# 绘制聚类之后的结果
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,
)

axes[2].scatter(
    X_blob[:, 0],
    X_blob[:, 1],
    marker="o",
    c=regs[2].labels_,
    s=25,
    cmap=plt.cm.autumn,
)

plt.show()

针对3种不同的样本数据,调节参数之后,聚类的效果还不错。

感兴趣的话,可以试试修改上面代码中的DBSCAN定义部分的参数:

python 复制代码
# 定义
regs = [
    DBSCAN(min_samples=2, eps=0.1),
    DBSCAN(min_samples=2, eps=0.2),
    DBSCAN(min_samples=3, eps=2),
]

调节不同的 min_sampleeps,看看不同的聚类效果。

4. 总结

总的来说,基于密度的空间聚类 算法是一种强大的工具,能够从数据中提取有价值的信息。

但是,如同所有的算法一样,它也有其局限性,需要在合适的应用场景中使用,才能达到最佳的效果。

它的优势主要在于:

  1. 能够发现任意形状的簇
  2. 对噪声和异常值有较好的鲁棒性
  3. 不需要提前知道簇的数量

不足之处则在于:

  1. 对于高维数据,密度计算可能会变得非常复杂和计算量大
  2. 算法的性能高度依赖于密度阈值的选择
  3. 在处理密度变化较大的数据时可能效果不佳
相关推荐
GeekArch8 分钟前
第5讲:嵌入式场景二范式决策树:什么情况快写、什么情况严写
人工智能·stm32·单片机·mcu·物联网·决策树·机器学习
闻道且行之9 小时前
TurboOCR:基于PP-OCRv6的极速Windows离线OCR工具,深度解析3.4GB依赖背后的技术架构
c++·人工智能·python·qt·机器学习·ocr
数聚天成DeepSData13 小时前
遥感农业数据集下载全攻略
数据库·人工智能·深度学习·机器学习·自然语言处理·数据挖掘
汤姆小白14 小时前
08-应用部署
人工智能·python·机器学习·numpy·transformer
lisw0516 小时前
【计算机科学技术】算力是什么?为何用小时计?怎么使用?
人工智能·机器学习·软件工程
汤姆小白17 小时前
06-LoRA参数高效微调
人工智能·python·机器学习·transformer
阿里技术18 小时前
从 Coder 到 Designer :电商团队数据研发的 Harness Engineering 实践
人工智能·microsoft·机器学习
苏州邦恩精密18 小时前
蔡司3D扫描仪厂家如何应用于新能源行业检测
人工智能·机器学习·3d·自动化·制造
AI科技星21 小时前
全域三极公理统一篇——所有分析、代数、拓扑、算子理论同源归一,回归0/1/∞创世本源闭环《全域数学vs传统数学:人类文明进阶200讲》第91讲
人工智能·线性代数·机器学习·数据挖掘·回归·乖乖数学·全域数学