文章目录

  • 1.引言
  • 2.`DBSCAN`相关定义
  • 3.`DBSCAN`密度聚类思想
    • 3.1 `DBSCAN`算法定义
    • 3.2 DBSCAN算法流程
  • 4.`DBSCAN`算法实现
    • 4.1 使用`numpy`实现`DBSCAN`算法
    • 4.2 使用`scikit-learn`调用`DBSCAN`算法
  • 5.`DBSCAN`优缺点
  • 6.数据及代码下载地址

1.引言

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一基于密度的聚类算法,DBSCAN将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。

2.DBSCAN相关定义

DBSCAN是基于一组邻域来描述样本集的紧密程度的,参数 ( ϵ , M i n P t s ) (ϵ, MinPts) (ϵ,MinPts)用来描述邻域的样本分布紧密程度。其中, ϵ ϵ ϵ描述了某一数据点的邻域距离阈值(半径), M i n P t s MinPts MinPts描述了数据点半径为 ϵ ϵ ϵ的邻域中数据点个数的最小个数。下面是与密度聚类相关的定义(假设我的样本集是 D = ( x 1 , x 2 , . . . , x m ) D=(x_1,x_2,...,x_m) D=(x1​,x2​,...,xm​)):

  • ϵ ϵ ϵ-邻域:对于 x j ∈ D x_j∈D xj​∈D,其 ϵ ϵ ϵ-邻域包含样本集 D D D中与 x j x_j xj​的距离不大于 ϵ ϵ ϵ的子样本集。即 N ϵ ( x j ) = { x i ∈ D ∣ d i s t a n c e ( x i , x j ) ≤ ϵ } N_ϵ(x_j)=\{x_i∈D|distance(x_i,x_j)≤ϵ\} Nϵ​(xj​)={xi​∈D∣distance(xi​,xj​)≤ϵ}, 这个子样本集的个数记为 ∣ N ϵ ( x j ) ∣ |N_ϵ(x_j)| ∣Nϵ​(xj​)∣。 ϵ ϵ ϵ-邻域是一个集合
  • 核心对象:对于任一样本 x j ∈ D x_j∈D xj​∈D,如果其 ϵ ϵ ϵ-邻域对应的 N ϵ ( x j ) N_ϵ(x_j) Nϵ​(xj​)至少包含 M i n P t s MinPts MinPts个样本,即如果 ∣ N ϵ ( x j ) ∣ ≥ M i n P t s |N_ϵ(x_j)|≥MinPts ∣Nϵ​(xj​)∣≥MinPts,则 x j x_j xj​是核心对象。
  • 密度直达:如果 x i x_i xi​位于 x j x_j xj​的 ϵ ϵ ϵ-邻域中,且 x j x_j xj​是核心对象,则称 x i x_i xi​由 x j x_j xj​密度直达。反之不一定成立,即此时不能说 x j x_j xj​由 x i x_i xi​密度直达, 除非且 x i x_i xi​也是核心对象,即密度直达不满足对称性
  • 密度可达:对于 x i x_i xi​和 x j x_j xj​,如果存在样本样本序列 p 1 , p 2 , . . . , p T p_1,p_2,...,p_T p1​,p2​,...,pT​,满足 p 1 = x i , p T = x j p1=x_i,p_T=x_j p1=xi​,pT​=xj​, 且 p t + 1 p_{t+1} pt+1​由 p t p_t pt​密度直达,则称 x j x_j xj​由 x i x_i xi​密度可达。也就是说,密度可达满足传递性。此时序列中的传递样本** p 1 , p 2 , . . . , p T − 1 p_1,p_2,...,p_{T−1} p1​,p2​,...,pT−1​均为核心对象**,因为只有核心对象才能使其他样本密度直达。密度可达也不满足对称性,这个可以由密度直达的不对称性得出。
  • 密度相连:对于 x i x_i xi​和 x j x_j xj​,如果存在核心对象样本 x k x_k xk​,使** x i x_i xi​和 x j x_j xj​均由 x k x_k xk​密度可达**,则称 x i x_i xi​和 x j x_j xj​密度相连。密度相连关系满足对称性。

从下图可以很容易看出理解上述定义,图中 M i n P t s = 5 MinPts=5 MinPts=5,红色的点都是核心对象,因为其 ϵ ϵ ϵ-邻域至少有 5 5 5个样本。黑色的样本是非核心对象。所有核心对象密度直达的样本在以红色核心对象为中心的圆内,如果不在圆内,则不能密度直达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列,此序列是一个簇集。在这些密度可达的样本序列的ϵ-邻域内所有的样本相互都是密度相连的 (注意,此图中有两个簇集)

3.DBSCAN密度聚类思想

3.1 DBSCAN算法定义

DBSCAN的聚类定义很简单: 由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇。(注意是密度相连的集合),簇里面可以有一个或者多个核心对象。如果只有一个核心对象,则簇里其他的非核心对象样本都在这个核心对象的 ϵ ϵ ϵ-邻域里;如果有多个核心对象,则簇里的任意一个核心对象的 ϵ ϵ ϵ-邻域中一定有一个其他的核心对象,否则这两个核心对象无法密度可达。这些核心对象的 ϵ ϵ ϵ-邻域里所有的样本的集合组成的一个DBSCAN聚类簇。

那么怎么才能找到这样的簇样本集合呢?DBSCAN使用的方法很简单,它任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。接着继续选择另一个没有类别的核心对象去寻找密度可达的样本集合,这样就得到另一个聚类簇 (这样的得到都肯定是密度相连的)。一直运行到所有核心对象都有类别为止。

基本上这就是DBSCAN算法的主要内容了,是不是很简单?但是我们还是有三个问题没有考虑。

  • 异常点问题:一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象在周围,在DBSCAN中,我们一般将这些样本点标记为噪音点。
  • 距离度量问题:即如何计算某样本和核心对象样本的距离。在DBSCAN中,一般采用最近邻思想,采用某一种距离度量来衡量样本距离,比如欧式距离、曼哈顿距离等。
  • 数据点优先级分配问题:例如某些样本可能到两个核心对象的距离都小于ϵ,但是这两个核心对象由于不是密度直达,又不属于同一个聚类簇,那么如果界定这个样本的类别呢?一般来说,此时DBSCAN采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。也就是说BDSCAN的算法不是完全稳定的算法。

3.2 DBSCAN算法流程

输入:样本集 D = ( x 1 , x 2 , . . . , x m ) D=(x_1,x_2,...,x_m) D=(x1​,x2​,...,xm​),邻域参数 ( ϵ , M i n P t s ) (ϵ,MinPts) (ϵ,MinPts)

  1. 初始化核心对象集合 Ω = ∅ , Ω=∅, Ω=∅,初始化类别 k = 0 k=0 k=0
  2. 遍历 D D D的元素,如果是核心对象,则将其加入到核心对象集合 Ω Ω Ω中
  3. 如果核心对象集合 Ω Ω Ω中元素都已经被访问,则算法结束,否则转入步骤4.
  4. 在核心对象集合 Ω Ω Ω中,随机选择一个未访问的核心对象 o o o,首先将 o o o标记为已访问,然后将 o o o标记类别 k k k,最后将 o o o的 ϵ ϵ ϵ-邻域中未访问的数据,存放到种子集合 s e e d s seeds seeds中。
  5. 如果种子集合 s e e d s = ∅ seeds=∅ seeds=∅,则当前聚类簇 C k C_k Ck​生成完毕, 且 k = k + 1 k=k+1 k=k+1,跳转到3。否则,从种子集合 s e e d s seeds seeds中挑选一个种子点 s e e d seed seed,首先将其标记为已访问、标记类别 k k k,然后判断 s e e d seed seed是否为核心对象,如果是将 s e e d seed seed中未访问的种子点加入到种子集合中,跳转到5

4.DBSCAN算法实现

4.1 使用numpy实现DBSCAN算法

import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist
from scipy.spatial.distance import squareform
import time
# 计算距离矩阵
def compute_squared_EDM(X):return squareform(pdist(X,metric='euclidean'))# DBSCAN算法核心过程
def DBSCAN(data,eps,minPts):# 获得距离矩阵disMat = compute_squared_EDM(data)# 获得数据的行和列(一共有n条数据)n, m = data.shape# 将矩阵的中小于minPts的数赋予1,大于minPts的数赋予零,然后1代表对每一行求和,然后求核心点坐标的索引core_points_index = np.where(np.sum(np.where(disMat <= eps, 1, 0), axis=1) >= minPts)[0]# 初始化类别,-1代表未分类。labels = np.full((n,), -1)clusterId = 0# 遍历所有的核心点for pointId in core_points_index:# 如果核心点未被分类,将其作为的种子点,开始寻找相应簇集if (labels[pointId] == -1):# 首先将点pointId标记为当前类别(即标识为已操作)labels[pointId] = clusterId# 然后寻找种子点的eps邻域且没有被分类的点,将其放入种子集合neighbour=np.where((disMat[:, pointId] <= eps) & (labels==-1))[0]seeds = set(neighbour)# 通过种子点,开始生长,寻找密度可达的数据点,一直到种子集合为空,一个簇集寻找完毕while len(seeds) > 0:# 弹出一个新种子点newPoint = seeds.pop()# 将newPoint标记为当前类labels[newPoint] = clusterId# 寻找newPoint种子点eps邻域(包含自己)queryResults = np.where(disMat[:,newPoint]<=eps)[0]# 如果newPoint属于核心点,那么newPoint是可以扩展的,即密度是可以通过newPoint继续密度可达的if len(queryResults) >= minPts:# 将邻域内且没有被分类的点压入种子集合for resultPoint in queryResults:if labels[resultPoint] == -1:seeds.add(resultPoint)# 簇集生长完毕,寻找到一个类别clusterId = clusterId + 1return labels# 将分类后的数据可视化显示
def plotFeature(data, labels_):clusterNum=len(set(labels_))fig = plt.figure()scatterColors = ['black', 'blue', 'green', 'yellow', 'red', 'purple', 'orange', 'brown']ax = fig.add_subplot(111)for i in range(-1,clusterNum):colorSytle = scatterColors[i % len(scatterColors)]subCluster = data[np.where(labels_==i)]ax.scatter(subCluster[:,0], subCluster[:,1], c=colorSytle, s=12)plt.show()# 加载数据
data = np.loadtxt("./cluster2.csv", delimiter=",")
start = time.clock()
# DBSCAN聚类并返回标识;ϵ=2,且MinPts=15
labels=DBSCAN(data,3,30)
end = time.clock()
print('finish all in %s' % str(end - start))
plotFeature(data, labels)

注意:棕色是离群点

4.2 使用scikit-learn调用DBSCAN算法

# -*- coding: utf-8 -*-
import numpy as np
from sklearn.cluster import DBSCAN
# 加载数据
data=np.loadtxt("788points.txt",delimiter=",")
# 构造一个ϵ=2,MinPts=15的聚类器,距离使用欧式距离
estimator=DBSCAN(eps=2,min_samples=15,metric='euclidean')
# 聚类数据
estimator.fit(data)
# 输出聚类都类别(-1代表异常点)
print(estimator.labels_)

5.DBSCAN优缺点

DBSCAN的主要优点有:

  • 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。
  • 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
  • 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。

DBSCAN的主要缺点有:

  • 如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。
  • 如果样本集较大时,聚类收敛时间较长
  • 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

6.数据及代码下载地址

  • GitHub的数据及代码下载地址为:GitHub的数据及代码下载链接(如果从GitHub下载代码,麻烦给小Demo一个Star,您的支持是我最大的动力)

(3)聚类算法之DBSCAN算法相关推荐

  1. 【建模算法】dbscan算法(python实现)

    [建模算法]dbscan算法(python实现) 对于学习机器学习和数据挖掘数据分析的小伙伴们来说,dbscan算法一定不会陌生.dbscan算法是一种基于密度的空间聚类算法,它可以快熟处理聚类同时有 ...

  2. 聚类方法:DBSCAN算法研究

    DBSCAN聚类算法三部分: 1.        DBSCAN原理.流程.参数设置.优缺点以及算法: http://blog.csdn.net/zhouxianen1987/article/detai ...

  3. 聚类kmeans和DBSCAN算法的简单实现

    在无监督学习中,我们首先就会接触到kmeans算法,因为既简单,又实用,而且速度也很快.所以今天在这里写一个非常简单的kmeans算法,以帮助我们更快的领悟算法的思想,以及它的变种.一下是其实现步骤 ...

  4. 聚类方法:DBSCAN算法研究(1)--DBSCAN原理、流程、参数设置、优缺点以及算法

    DBSCAN聚类算法三部分: 1.        DBSCAN原理.流程.参数设置.优缺点以及算法: http://blog.csdn.net/zhouxianen1987/article/detai ...

  5. 聚类方法:DBSCAN算法研究(2)--matlab代码实现

    DBSCAN聚类算法三部分: 1.        DBSCAN原理.流程.参数设置.优缺点以及算法: http://blog.csdn.net/zhouxianen1987/article/detai ...

  6. 聚类算法之DBSCAN算法之一:经典DBSCAN

    DBSCAN是基于密度空间的聚类算法,与KMeans算法不同,它不需要确定聚类的数量,而是基于数据推测聚类的数目,它能够针对任意形状产生聚类. 1.epsilon-neighborhood epsoi ...

  7. R实现K均值算法,层次聚类算法与DBSCAN算法

    1.聚类的基本概念 聚类分析(cluster analysis)仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组.其目标是,组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不 ...

  8. 机器学习(6):聚类算法:K-MEANS算法、DBSCAN算法

    目录 一.聚类算法原理 二.K-MEANS算法 2.1 K-MEANS算法基本介绍 2.2   K-MEANS算法过程 三.DBSCA

  9. dbscan算法_DBSCAN聚类算法探索

    作者:单华 DBSCAN是非监督学习中密度学习算法里的佼佼者.本文对DBSCAN做了简单的探索,全文无数学公式,共2800余字. 在ARGO之前提到的聚类与K-Means一文中,提到了密度聚类方法DB ...

最新文章

  1. 17日南土所蒋瑀霁报告:红壤团聚体尺度养分转化的生物学过程(线虫-微生物互作机制)...
  2. activity堆栈式管理
  3. 【AI-1000问】为什么LeNet5倒数第二个全连接层维度为84?
  4. wxWidgets:在全局范围内捕捉关键事件
  5. 【测试点分析】1104 Sum of Number Segments (20 分)
  6. jframe运行和预览大小不一样_在泉州楼市中12个热门置业板块中,购房竞争压力大小各不一样...
  7. tshark mysql_使用tshark抓包分析http请求
  8. 1 亿人民币的差距!硅谷初创公司工资期权调查报告里的 0.1% 与 1%
  9. EditPlus注册码 亲测最新版可用
  10. linux常用文件及作用总结(profile/.bashrc等)
  11. [PKKS19] 《Revealing Scenes by Inverting Structure from Motion Reconstructions》(CVPR2019)阅读笔记(完)
  12. Kaggle经典案例—信用卡诈骗检测的完整流程(学习笔记)
  13. 工业控制系统基础知识入门(一)
  14. 推荐几个经常发干货的公众号
  15. CS5801HDMI转eDP/DP转换芯片资料|CS5801规格书
  16. Word文档自动生成目录
  17. 性的短暂而致真情永失
  18. 高德开发者地图 快速使用报错
  19. linux中pid,tid, 以及 真实pid的关系
  20. 阿里云人工智能课程(一)机器学习介绍

热门文章

  1. java生成pdf方法_详解Java生成PDF文档方法|chu
  2. Elasticsearch:理解 Master,Elections,Quorum 及 脑裂
  3. windows-soft1:VMware Workstation Pro15安装图文详细介绍
  4. JSP 编译和运行过程与JSP源码简单分析
  5. 200821-阿里云服务器ECS学生使用经验小节(非CS折腾了大半天)
  6. Kuerbernetes 1.11 二进制安装
  7. 2022年第七届数维杯大学生数学建模挑战赛报名通知
  8. Windows系统的四个常见后门
  9. Codepen 每周精选:22个页面特效(2018-5-2)
  10. mysql触发器优缺点_MySQL 的触发器