聚类分析 | Python密度聚类(DBSCAN)

news/2024/5/20 5:59:34 标签: python, 聚类, 机器学习, DBSCAN

密度聚类是一种无需预先指定聚类数量的聚类方法,它依赖于数据点之间的密度关系来自动识别聚类结构。
本文中,演示如何使用密度聚类算法,具体是DBSCAN(Density-Based Spatial Clustering of Applications with Noise)来对一个实际的数据集进行聚类分析。

一、基本介绍

密度聚类的核心思想是将数据点分为高密度区域和低密度区域。高密度区域内的数据点被认为属于同一簇,而低密度区域的数据点被视为噪声或离群点。

DBSCAN是一种常用的密度聚类算法,其原理基于以下概念:

核心点(Core Point):在半径ε内至少包含MinPts个数据点的数据点被称为核心点。
边界点(Border Point):在半径ε内包含少于MinPts个数据点但位于核心点邻域内的数据点被称为边界点。
噪声点(Noise Point):既不是核心点也不是边界点的数据点被称为噪声点。
DBSCAN算法的主要步骤如下:

1、从数据集中选择一个未被访问的数据点。

2、如果该数据点是核心点,则以该点为种子开始构建一个聚类簇。

3、通过扩展核心点的邻域,将相邻的核心点和边界点加入到聚类簇中。

4、重复步骤1-3,直到没有更多的核心点可以被添加到聚类簇中。

5、转到下一个未被访问的数据点,重复上述过程,直到所有数据点都被访问。

二、 模型原理

DBSCAN使用两个参数来定义聚类的性质:半径(ε)和最小数据点数(MinPts)。

ε(epsilon):半径参数定义了一个数据点的邻域范围。数据点在ε半径范围内的其他数据点将被认为是其邻居。
MinPts:最小数据点数参数定义了一个核心点所需的邻居数量。如果一个数据点拥有至少MinPts个邻居,它将被视为核心点。
DBSCAN将数据点分为三个类别:核心点、边界点和噪声点,根据以下公式:

核心点:如果数据点p在半径ε内至少有MinPts个数据点,即N§ >= MinPts,其中N§表示p的邻居数量。
边界点:如果数据点q在半径ε内包含少于MinPts个数据点,但位于某个核心点的半径ε内,即N(q) < MinPts 且q至少属于某个核心点的邻域。
噪声点:既不是核心点也不是边界点的数据点。

源码设计

本案例使用Python和Scikit-Learn库来对一个示例数据集进行DBSCAN聚类分析。

使用一个模拟的数据集并设置适当的参数。

  • 导入所需的库
    from sklearn.cluster import DBSCAN
    import numpy as np
    import matplotlib.pyplot as plt

  • 生成示例数据集
    np.random.seed(0)
    X = np.random.randn(300, 2)

  • 训练DBSCAN模型
    dbscan = DBSCAN(eps=0.3, min_samples=5)
    labels = dbscan.fit_predict(X)

现在,让我们使用Matplotlib来可视化DBSCAN聚类结果。

把核心点、边界点和噪声点分别用不同的颜色标记。

python">core_samples_mask = np.zeros_like(labels, dtype=bool)
core_samples_mask[dbscan.core_sample_indices_] = True

- 噪声点为-1,簇标记从0开始
n_clusters = len(set(labels)) - (1 if -1 in labels else 0)

unique_labels = set(labels)
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]

for k, col in zip(unique_labels, colors):
    if k == -1:
        # 噪声点为黑色
        col = [0, 0, 0, 1]

    class_member_mask = (labels == k)

    xy = X[class_member_mask & core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor='k', markersize=14)

    xy = X[class_member_mask & ~core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor='k', markersize=6)

plt.title(f'Estimated number of clusters: {n_clusters}')
plt.show()

上述代码将生成一个可视化图形,其中不同的颜色代表不同的聚类簇,黑色点代表噪声点。

在这里插入图片描述
通过密度聚类DBSCAN可以自动发现聚类的形状和大小,而不需要预先指定簇的数量。这使得DBSCAN在处理各种实际应用中非常有用,如异常检测、图像分割和地理空间分析。

这个例子提供了一个完整的密度聚类实际案例,包括了原理、公式解释、模型训练和可视化结果。密度聚类是一个强大的工具,适用于多种领域的数据分析和挖掘任务。


http://www.niftyadmin.cn/n/5109875.html

相关文章

MySQL学习路线

1 学习路线图 2 参考的文档&#xff1a; 民工哥技术之路菜鸟教程

unittest自动化测试框架,全网独一份

一、单元测试的定义 1、什么是单元测试&#xff1f; 单元测试是指&#xff0c;对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&#xff0c;这里的最小可测试单元通常是指函数或者类&#xff0c;一般是开发来做的&#xff0c;按照测试阶段来分&…

springboot缓存篇之mybatis一级缓存和二级缓存

前言 相信很多人都用过mybatis&#xff0c;这篇文章主要是介绍mybatis的缓存&#xff0c;了解一下mybatis缓存是如何实现&#xff0c;以及它在实际中的应用 一级缓存 什么是mybatis一级缓存&#xff1f;我们先看一个例子&#xff1a; GetMapping("/list") public…

深度学习 框架代码(草稿)

文章目录 train.pydataload_five_flower.pytrain_engin.pylr_methods.py__init__.py train_sample.py 和 test.py 见文章&#xff1a; 深度学习-AlexNet代码实现 用 parser 方便服务器中的终端操作第三个代码将 mac的 mps 和 cuda 混合了&#xff0c;有点问题&#xff0c;看下代…

10G SFP+线缆选购指南

凭借低成本和易安装的优势&#xff0c;在10G速率短距离传输中SFP线缆比SFP光模块更受欢迎。本文将从类型、优势、应用和选购指导等方面为您介绍10G SFP线缆&#xff0c;旨在帮助您更快做出购买决策。 10G SFP线缆&#xff1a;定义和类型 SFP线缆是一种高速线缆&#xff0c;两…

分布式锁 - 理论篇

一、为什么需要分布式锁 二、分布式锁实现 1.分布式锁演进 - 基本原理 我们可以同时去一个地方“占坑”&#xff0c;如果占到&#xff0c;就执行逻辑。否则就必须等待&#xff0c;直到释放锁。“占坑”可以去redis&#xff0c;可以去数据库&#xff0c;可以去任何大家都能访…

员工电脑监控软件系统的选择和价值介绍!

随着企业的不断发展&#xff0c;员工越来越多&#xff0c;使用的电脑也随之增多&#xff0c;管理者很难管理员工上班行为。员工电脑监控软件系统可以实现远程监管所有员工电脑&#xff0c;电脑端、手机端都可操控&#xff0c;满足管理者随时随地监管的需求。 选择员工电脑监控…

算法|每日一题|统计无向图中无法互相到达点对数|并查集

2316. 统计无向图中无法互相到达点对数 原题地址&#xff1a; 力扣每日一题&#xff1a;统计无向图中无法互相到达点对数 给你一个整数 n &#xff0c;表示一张 无向图 中有 n 个节点&#xff0c;编号为 0 到 n - 1 。同时给你一个二维整数数组 edges &#xff0c;其中 edges[i…