DBSCAN 算法介绍以及C++实现

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)

一、算法简介

什么是DBSCAN?
DBSCAN(Density-Based Spatial Clustering of Application with Noise),是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。其目标是寻找被低密度区域分离的高密度区域,通俗点说就是把扎堆的点(高密度)找出来,而点很少很稀疏的地方(低密度)就作为分割区域。

一、算法详解

1)、关键参数及其概念

关键参数:E(半径)、 MinPts(最小样本点数)
这里写图片描述
这里写图片描述

2)、描述:

DBSCAN算法描述:
输入: 包含n个对象的数据库,半径e,最少数目MinPts;
输出:所有生成的簇,达到密度要求。
(1)Repeat
(2)从数据库中抽出一个未处理的点;
(3)IF抽出的点是核心点 THEN 找出所有从该点密度可达的对象,形成一个簇;
(4)ELSE 抽出的点是边缘点(非核心对象),跳出本次循环,寻找下一个点;
(5)UNTIL 所有的点都被处理。

DBSCAN对用户定义的参数很敏感,细微的不同都可能导致差别很大的结果,而参数的选择无规律可循,只能靠经验确定。

3)、算法步骤
步骤:

DBScan需要二个参数: 扫描半径 E(eps)和最小包含点数MinPts(minPts)。
1、 任选一个未被访问(unvisited)的点开始,找出与其距离在eps之内(包括eps)的所有附近点。
如果 附近点的数量 ≥ minPts,则当前点与其附近点形成一个簇,并且出发点被标记为已访问(visited)。
2、然后递归,以相同的方法处理该簇内所有未被标记为已访问(visited)的点,从而对簇进行扩展。
3、如果 附近点的数量 < minPts,则该点暂时被标记作为噪声点。
4、如果簇充分地被扩展,即簇内的所有点被标记为已访问,然后用同样的算法去处理未被访问的点。

4)、具体描述
具体算法描述如下:
(1)检测数据库中尚未检查过的对象p,如果p未被处理(归为某个簇或者标记为噪声),则检查其邻域,若包含的对象数不小于MinPts ,建立新簇C,将其中的所有点加入候选集N;
(2)对候选集N 中所有尚未被处理的对象q,检查其邻域,若至少包含MinPts个对象,则将这些对象加入N;如果q 未归入任何一个簇,则将q 加入C;
(3)重复步骤2),继续检查N 中未处理的对象,当前候选集N为空;
(4)重复步骤1)~3),直到所有对象都归入了某个簇或标记为噪声。
其伪代码描述如下:
输入:数据对象集合D,半径Eps,密度阈值MinPts
输出:聚类C

核心伪代码

**DBSCAN(D, Eps, MinPts)
Begin
    init C=0; //初始化簇的个数为0
    for each unvisited point p in D
        mark p as visited; //将p标记为已访问
        N = getNeighbours (p, Eps);
        //如果满足sizeOf(N) < MinPts,则将p标记为噪声
        if sizeOf(N) < MinPts then
            mark p as Noise; 
                    else
            C= next cluster; //建立新簇C
            ExpandCluster (p, N, C, Eps, MinPts);
        end if
    end for
End**
其中ExpandCluster算法伪码如下:
ExpandCluster(p, N, C, Eps, MinPts)
    add p to cluster C; //首先将核心点加入C
    for each point p’ in N
        mark p' as visited;
        N’ = getNeighbours (p’, Eps); //对N邻域内的所有点在进行半径检查
        if sizeOf(N’) >= MinPts then
            N = N+N’; //如果大于MinPts,就扩展N的数目
        end if
        if p’ is not member of any cluster
            add p’ to cluster C; //将p' 加入簇C
        end if
    end for
End ExpandCluster

部分实验结果截图:

这里写图片描述

算法总结

好处:

与K-means方法相比,DBSCAN不需要事先知道要形成的簇类的数量。

  1. 与K-means方法相比,DBSCAN可以发现任意形状的簇类。

  2. 同时,DBSCAN能够识别出噪声点。

4.DBSCAN对于数据库中样本的顺序不敏感,即Pattern的输入顺序对结果的影响不大。但是,对于处于簇类之间边界样本,可能会根据哪个簇类优先被探测到而其归属有所摆动。

缺点:

  1. DBScan不能很好反映高维数据。

  2. DBScan不能很好反映数据集以变化的密度。

有关参数选择问题

DBSCAN聚类算法的Eps及MinPts参数选择问题
为解决DBSCAN聚类算法的Eps及MinPts参数选择问题,提出一种领域无关的参数动态选择方法。首先,基于k-均值算法对数据集进行初步聚类,聚类中采用最大最小距离方法确定初始聚类中心。其次,针对k-均值聚类结果,计算统计各聚类中样本间距离的分布情况,选择使得具有最大样本对数的距离值作为对应类的Eps值,并通过Eps获得MinPts值。最后,对DBSCAN算法进行改进,使其可根据当前核心点所属k-均值聚类对应的Eps对其运行值进行自适应调整。

源码下载连接

http://download.csdn.net/detail/u011557212/9700546

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值