基于密度聚类算法DBSCAN

聚类算法

聚类分析或简称聚类基本上是一种无监督学习方法,它将数据点划分为多个特定的批次或组,使得同一组中的数据点具有相似的属性,而不同组中的数据点在某种意义上具有不同的属性。它包含许多基于差分进化的不同方法。例如:K-Means(基于点间距离)、亲和传播(基于图距离)、均值漂移(基于点间距离)、DBSCAN(基于邻近点距离)、高斯混合(基于到中心的马哈拉诺比斯距离)、谱聚类(基于图距离)等。

聚类算法是一种无监督学习技术,旨在将数据集划分为若干个簇,使得同一簇内的数据点彼此相似,而不同簇的数据点差异显著。这些算法在数据分析、图像处理、市场研究、生物信息学等领域有着广泛的应用,帮助我们识别数据中的内在结构和模式。

聚类算法主要包括以下几种类型:

  • 划分聚类:如K-means,将数据划分为K个簇。

  • 层次聚类:如凝聚层次聚类,逐步合并或拆分数据点形成簇。

  • 密度聚类:如DBSCAN,通过密度连接识别簇。

从根本上讲,所有聚类方法都使用相同的方法,即首先计算相似度,然后使用它将数据点聚类为组或批次。在这里,我们将重点介绍基于密度的噪声应用空间聚类DBSCAN)聚类方法。

DBSCAN聚类算法简介

发展历史

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,由Martin Ester, Hans-Peter Kriegel, Jörg Sander和Xiaowei Xu于1996年提出。DBSCAN的特点是它不需要事先指定簇的数量,能够识别任意形状的簇,并且能够有效处理噪声点。这种算法在推出后,因其强大的功能和灵活性,迅速在学术界和工业界获得了广泛的应用。

有趣的是,DBSCAN的提出标志着数据挖掘领域的一次重大突破。在此之前,大多数聚类算法都依赖于簇的形状和大小,而DBSCAN能够灵活地适应各种复杂的数据结构,这使得它在许多实际应用中大放异彩。

数学原理

DBSCAN算法的核心思想是通过密度连接的概念来识别簇。算法主要有两个参数:(eps)和。定义了一个点的邻域半径,而表示一个点的-邻域内需要有多少个点才能被认为是核心点。

簇是由密度可达的核心点形成的最大集合。一个点到点的密度可达性定义如下:

应用领域和场景

DBSCAN算法的应用非常广泛,包括但不限于:

  • 市场细分:识别具有相似购买行为的客户群体。

  • 社交网络分析:发现社交媒体上的紧密交流群体。

  • 天文数据分析:识别星系或其他天体的集群。

  • 地理数据分析:识别地理空间中的区域分布,如城市规划中的热点区域。

  • 异常检测:在各种环境监测数据中识别异常或离群点。

Python实现及可视化

以下是一个DBSCAN算法的简单Python实现示例,使用了scikit-learn库,并进行了可视化:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN

# 生成数据
X, _ = make_moons(n_samples=300, noise=0.1, random_state=42)

# 应用DBSCAN算法
dbscan = DBSCAN(eps=0.2, min_samples=5)
clusters = dbscan.fit_predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap='viridis', marker='o')
plt.title('DBSCAN Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.colorbar(label='Cluster Label')
plt.show()

图片

这段代码首先生成了一组具有两个月牙形结构的数据点,然后应用DBSCAN算法对其进行聚类,并使用Matplotlib库将结果可视化。不同的颜色代表不同的簇,从而清晰地显示了聚类效果。

# -*- coding: utf-8 -*-
"""
@author: https://blog.csdn.net/suiyingy
"""
 
 
import open3d as o3d
import numpy as np
 
if __name__ == '__main__':
    file_path = 'rabbit.pcd'
    pcd = o3d.io.read_point_cloud(file_path)
    pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定显示为灰色
    print(pcd)
    #labels返回聚类成功的类别,-1表示没有分到任何类中的点
    labels = np.array(pcd.cluster_dbscan(eps=0.5, min_points=60, print_progress=True))
    #最大值加1相当于共有多少个类别
    num_label = np.max(labels) + 1
    print('类别数量:', max(labels)+1)
    #生成n个类别的颜色,n表示聚类别成功的类,-1表示没有分类成功的类别
    colors = np.random.randint(255, size=(max(num_label, 1), 3))/255.
    colors = colors[labels]
    #没有分类成功的点设置为黑色
    colors[labels < 0] = 0 
    pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])
 
    # 点云显示
    o3d.visualization.draw_geometries([pcd], #点云列表
                                      window_name="DBSCAN聚类",
                                      point_show_normal=False,
                                      width=800,  # 窗口宽度
                                      height=600)  # 窗口高度

图片

这段代码使用Open3D库读取点云文件'rabbit.pcd',将点云显示为灰色,应用DBSCAN算法进行聚类,然后根据聚类结果为每个点分配随机颜色,未分类成功的点显示为黑色,最后在窗口中可视化点云及其聚类结果。

更多信息参见:

https://www.geeksforgeeks.org/dbscan-clustering-in-ml-density-based-clustering/

以上内容总结自网络,如有帮助欢迎关注与转发,我们下次再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值