DBSCAN聚类算法

一、什么是DBSCAN算法

        DBSCAN算法指定一个半径ε和一个数量M,它将空间中的点分成3种:核心点指在半径范围ε内含有超过M个相邻点的点;边界点指非核心点,但在核心点半径ε范围内的点;其余的点称为噪声。DBSCAN遍历每个点,判断每个点是否为核心点,寻找每个核心点周围的所有点,并将周围的点和相应核心点标记为同一个类别。
       在遍历整个样本集的过程中,首先根据一个点的半径ε范围内的点的数量判断其是否为核心点。若是核心点,就将半径ε范围内的点和该点标记为同一类,并对每个周围的点做相同操作,再次查看是否为核心点。持续该过程,直到每个点都被遍历过。此时,未被分类的点就是噪声。DBSCAN算法需要对半径ε和阀值M进行调参。

没有进行DBSCAN算法:

图中的epsilon指的是半径,minPoints指的是在半径为1的空间里有四个小球即可扩散

进行过DBSCAN算法:

二、DBSCAN算法的算法步骤:
(1)计算所有点的ε邻域: 对于数据集中的每一个点P,计算其ε邻域中有多少个邻居。这个邻居数量的阈值通常由一个参数MinPts定义。
(2)标记核心点: 如果一个点的ε邻域中的点的数量大于或等于MinPts,那么这个点就被标记为核心点。
(3)寻找密度相连的点: 对于每一个核心点,寻找所有与其密度相连的点。如果点P在点O的ε邻域中,并且O是一个核心点,那么P就是一个与O密度相连的点。
(4)标记噪声点和边界点: 没有被标记为核心点的点被标记为噪声点。与某个核心点密度相连但不是核心点的点被标记为边界点。
为每一个核心点或与其密度相连的点赋予一个独立的簇标签: 为每一个核心点或与其密度相连的点赋予一个独立的簇标签。如果一个点与多个核心点密度相连,那么它将被赋予第一个找到的核心点的簇标签。
(5)噪声点形成独立的簇: 所有的噪声点形成一个独立的簇。

三、DBSCAN算法的优缺点如下:

优点如下所示:
1. 不需要预设聚类数:DBSCAN不需要事先指定聚类的数量,这使得算法更加灵活。
2. 识别噪声点:DBSCAN能够识别并处理噪声点,这对于包含异常值的数据集来说非常有用。
3. 任意形状的聚类:DBSCAN可以发现任意形状的聚类,不仅限于球形或圆形。
4. 密度基础:聚类是基于密度的连通性,这使得算法能够识别出由密度变化定义的聚类。
5. 参数较少:只需要设置两个参数(ε和MinPts),相比其他算法,参数调整较为简单。
缺点如下所示:
1. 参数敏感性:ε和MinPts的选取对聚类结果有很大影响,不恰当的参数可能导致聚类效果不佳。
2. 对高维数据效率低:随着数据维度的增加,计算邻域点的复杂度增加,导致算法效率降低。
3. 对

### 欧几里得聚类算法的工作原理 #### 定义与目标 欧几里得聚类是一种基于距离度量的空间点分组方法,旨在将三维空间中的点云数据划分为多个离散的簇。该算法假设属于同一物体表面的点之间相互邻近,在几何上形成连通区域[^1]。 #### 数据结构支持 为了高效执行最近邻查询并加速搜索过程,通常会构建 k-d 树 (k-dimensional tree) 来索引输入点集。K-d 树通过递归划分空间来组织多维键值的数据集合,使得查找操作可以在 O(log n) 时间复杂度内完成[^3]。 #### 聚类流程概述 当给定一组未分类的点作为输入时: - **初始化参数** - 设置两个重要阈值:`cluster_tolerance`(即最大允许的距离差),用于定义两点间可视为相连的最大欧式距离;以及 `min_points_per_cluster` 和 `max_points_per_cluster` ,分别表示最小和最大的有效集群大小。 - **遍历点云** - 对于每一个尚未被分配到任何群集内的点 p_i : - 使用广度优先搜索(BFS) 或者深度优先搜索(DFS) 找出所有满足条件 d(p_j, p_i)<= cluster_tolerance 的相邻节点 j 形成初始子图 G_0; - 如果 |G_0| >= min_points_per_cluster,则将其标记为新发现的有效集群 C_k 并移除这些已处理过的顶点以免重复计算;反之则丢弃当前尝试得到的小规模孤立片段。 - **输出结果** - 经过上述迭代直至所有符合条件的连接都被探索完毕之后,最终获得一系列互不相交且各自内部紧密关联而外部相对独立的点云团块{C_1,C_2,...} 即为目标聚类成果。 ```cpp // PCL库中实现欧氏聚类的例子 #include <pcl/segmentation/extract_clusters.h> using namespace pcl; void euclideanClustering(const PointCloud<PointXYZ>::Ptr& cloud, std::vector<pcl::PointIndices>& clusters, double tolerance = 0.02f, int min_size = 100, int max_size = 25000){ // 创建 K-D Tree search::KdTree<PointXYZ>::Ptr tree(new search::KdTree<PointXYZ>); tree->setInputCloud(cloud); EuclideanClusterExtraction<PointXYZ> ec; ec.setClusterTolerance(tolerance); ec.setMinClusterSize(min_size); ec.setMaxClusterSize(max_size); ec.setSearchMethod(tree); ec.setInputCloud(cloud); ec.extract(clusters); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值