DBSCAN聚类算法

DBSCAN算法是一种基于密度的聚类算法(density-based clustering),这类算法是从样本密度的角度出发考察样本之间的连接性,通过可连接样本的不断扩展得到聚类簇。DBSCAN算法(Density-Based Spatial Clustering of Applications with Noise)是基于一组领域参数(ϵ,minpts)来刻画样本分布的紧密程度。

下面首先介绍下有关这个算法的一些基本概念:

  • ϵ-领域:对于xj属于D,其领域为包含在样本集D中的但是与xj的距离不大于ϵ的样本

  • 核心对象(core object):若xj的领域内至少包含minpts个样本,则xj是一个核心对象

  • 密度直达(directly density-reachable):若xj位于xi的领域中,且xi是核心对象,则称xj由xi密度可达

  • 密度可达(density-reachable):对xi与xj若存在样本序列p1,p2,p3,.....pn,其中p1=xi,pn=xj且pi+1由pi密度直达则称xj由xi密度可达

  • 密度相连(density-connected):对xi与xj,若存在xk使得xi与xj均由xk密度可达,则称xi与xj密度相连 

DBSCAN将簇定义为:由密度可达关系导出的最大的密度相连的样本集合

例:上图中ϵ=r,minpts=3,则P到M,M到Q密度直达,P到Q密度可达。同理O到S,O到R密度可达,则R到S密度相连,SOR就为一个DBSCAN算法聚出来的簇。

伪代码描述: 

标记所有对象为unvisited

Do

   随机选择一个unvisited对象P

   标记Pvisited

    if : P的领域里至少有minpts个对象

         创建一个新簇C,并把P添加到C

         令NP的领域中的对象集合

         for N中的每个P'

               if P'unvisited

                  标记P'visited

                   if P'的领域内至少有minpts个对象,则把这些对象添加到N

                      如果P'还不是任何簇的成员,把P'添加到C

         end for

         输出C(簇)

   else 标记P为噪声点

until 没有标记为unvisited的对象

如下二维数据集,设E=3.MinPts=3,使用DBSCAN对其聚类:

先扫描样本点P112

  • 计算其E邻域,即找样本点中与其距离不大于E的样本点

   P1样本点的E邻域为:{P1P2P3P13}

   P1的密度为4>MinPts,因此P1是核心点

   以P1点建立新簇C1,令NP1邻域内的点的集合

   对N中的每一个点q,如果q未处理过且是核心点,则将q邻域内的点并入N。如果q还不是任何簇的成员,把q添加到C1

  • 对P2邻域为{P1,P2,P3,P13},为核心点且未处理过将其邻域内的点并入N,把P2添加到C1
  •  对P3,邻域为{P1,P2,P3,P4,P13},同上,将P3邻域内的点并入N,把P3添加到C1
  •  对P13,邻域为{P1,P2,P3,P4,P13},同上,将P13邻域内的点并入N,把P13添加到C1
  •  继续考虑N中未处理的点P4,邻域为{P3,P4,P13},将P4邻域内的点并入N, 把P4添加到C1

此时集合N中对象全部处理完毕,得到簇C1,包含点{P1P2P3P4P13}

继续扫描样本点P558),同上得簇C2包含{P5P6P7P8}

继续扫描样本点P995):

    计算其邻域为{P9},为非核心点

继续扫描样本点P10112):

     P10样本点的E邻域为{P10,P11},为非核心点

继续扫描样本点P11(3,12):

     P11 样本点E邻域为{P10P11,P12},P11是核心点

     以P11点建立新簇C3,令NP11邻域内点的集合

     N中的每一个点q,如果q未处理过且是核心点,则将q邻域内的点并入N。如果q还不是任何簇的成员,把q添加到C1

      对P10,非核心点,把P10加入C3

      对P12,邻域为{P11,P12},非核心点,把P12加入C3

此时N中对象处理完毕得到簇C3
继续扫描样本点,P12和P13都已经处理过,算法结束
最后聚类结果为:3个簇

   C1{P1,P2,P3,P4,P13}
   C2{P5,P6,P7,P8}
   C3{P10,P11,P12}

样本点P9未归类为任何一个,最后判定为噪声

 

参考代码:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.cluster import DBSCAN

data = pd.read_csv('C:\\Users\\chang\\Desktop\\CODAS-master\\gaussian5000.csv')
data1 = np.array(data)

y_pred = DBSCAN(eps=0.022,min_samples=8).fit_predict(data1)
plt.scatter(data1[:, 0], data1[:, 1], data1[:, 2], c=y_pred)


plt.show()

参考动画演示

 

实验结果:

ϵ=0.022 minpts=8

 ​​​​​​ϵ=0.044 minpts=8

算法优缺点:

优点:

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

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

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

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

缺点:

1.对于高维数据,密度定义较麻烦。

2.如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差

3.调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

 

关于EMinPts参数的选择:

 

思想是这样的对于在一个类中的所有点,它们的第k个最近邻大概距离是一样的,噪声点的第k个最近邻的距离比较远。所以, 尝试根据每个点和它的第k个最近邻之间的距离来选取

1、给定数据集P={p(i); i=0,1,…n},对于任意点P(i),计算点P(i)到集合D的子集S={p(1), p(2), …, p(i-1), p(i+1), …, p(n)}中所有点之间的距离,距离按照从小到大的顺序排序,假设排序后的距离集合为D={d(1), d(2), …, d(k-1), d(k), d(k+1), …,d(n)},则d(k)就被称为k-距离。也就是说,k-距离是点p(i)到所有点(除了p(i)点)之间距离第k近的距离。对待聚类集合中每个点p(i)都计算k-距离,最后得到所有点的k-距离集合E={e(1), e(2), …, e(n)}

2对集合E进行升序排序后,绘出曲线,通过观察,将急剧发生变化的位置所对应的k-距离的值,确定为半径E的值

 

在上述E确定的情况下,统计数据集中每个点的E邻域内点的数目,然后对整个数据集中每个点的E邻域内的点的数目求数学期望得到MinPts,此时的MinPts为每个聚类中核心对象E邻域内的数据点个数的最优值。计算公式为:

 其中pi为点i在E邻域内点的个数

 

 

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值