作者:单华

DBSCAN是非监督学习中密度学习算法里的佼佼者。本文对DBSCAN做了简单的探索,全文无数学公式,共2800余字。

在ARGO之前提到的聚类与K-Means一文中,提到了密度聚类方法DBSCAN算法。那么本文将对这一聚类方法进行详细介绍,具体包括:

  • DBSCAN定义及基本概念
  • 算法原理和算法流程
  • 算法的优缺点
  • 用Scikit-learn学习DBSCAN聚类算法

一 DBSCAN定义及基本概念

DBSCAN(Density-Based SpatialClustering of Applications with Noise)是一种典型的密度聚类算法,这种聚类算法将簇视为由低密度区域隔离开来的高密度区域。由于这种相当普遍的观点,DBSCAN能在有噪音的空间数据中发现任意形状、大小分布的簇。

DBSCAN是基于一组邻域来描述样本集紧密程度的,它有两个输入参数:邻域半径Eps 和 密度阈值 MinPts。通过这两个参数可以区分出高密度点和低密度点,简单地说,就是某个数据点的邻域半径范围Eps内的数据点数目超过了最小包含点数阈值MinPts 即为高密度点,而DBSCAN 的主要思想就是将满足高密度的数据点聚类成一个簇

对应样本集D, DBSCAN 算法包含基本概念如下:

  • Eps邻域:对于给定对象q(q ∈ D),q的Eps邻域是以q为中心,Eps半径内的邻域。
  • 核心对象:对于给定对象q(q ∈ D),如果q的Eps邻域至少包含最小数目MinPts的对象,则称q为核心对象。
  • 边界对象:对于给定对象q(q ∈ D),如果q在某个核心对象的邻域内,但又不是核心对象,则称q为边界对象。
  • 噪音点:既不是核心点,也不是边界点的任何点。
  • 直接密度可达:如果q在r的Eps邻域内,而r是一个核心对象,则称q从r直接密度可达。
  • 密度可达:存在对象链
    ,
    。若所有的对象
    从对象
    关于Eps 和MinPts 直接密度可达,则称q 从p 关于Eps 和MinPts 密度可达。
  • 密度相连:给定对象r, p,q ∈D,若 p 和 q 都是从 r 出发,关于 Eps和MinPts 密度可达的,则称p 和q 是关于Eps 和MinPts 密度连接的。

从下图可以很容易理解上述概念,图中MinPts=5,红色的点是核心对象,因为其Eps-邻域至少有5个样本。黑色的点是非核心对象。所有核心对象直接密度可达的样本在以红色核心对象为中心的超球体内,如果不在超球体内,则不能直接密度可达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列。在这些密度可达的样本序列的Eps-邻域内所有的样本相互都是密度相连的。而那些不在任何超求体内的黑点则成为噪声。

二 算法原理和算法流程

DBSCAN算法的基本思路很简单:它从数据对象集合D 中任意没有类别的对象q开始,寻找从q 关于参数Eps 和MinPts 密度可达的所有对象,组成一个聚类。DBSCAN的聚类过程也叫密度扩展,整个过程由迭代的邻域搜索来完成。“具体做法是从某一核心点出发,不断的向密度可达的区域扩张,得到一个包含核心点和边界点的最大区域,这个区域中任意两点密度相连”。

根据上述分析,我们可以将DBSCAN 算法描述如下:

输入:包含n 个对象的数据集D,邻域半径Eps,密度阈值MinPts。期待输出:所有生成的簇。

1 初始化参数:设置数据库中所有对象为噪声和未访问。

2 从数据库中任选一个未被访问的核心对象,以该对象作为起始对象建立一个新类,递归地找出所有从该对象密度可达的对象,加入到该类中,并标记为已访问;

3 直到所有的对象都被访问,输出聚类结果,算法结束;否则转2步。

用流程图描述如下:

三 算法的优缺点

DBSCAN算法是基于密度聚类的代表,针对前面的算法描述,我们对DBSCAN算法的优缺点做一个总结。

DBSCAN具有以下主要优点:

1) 对噪声数据不敏感,可以发现空间中任意形状和大小的簇;

2) 由于只扫描一次整个数据库,算法是高效的;

3) 与K-means比起来,不需要输入类别的个数;

4) 聚类结果几乎不依赖于点遍历顺序。

但DBSCAN也存在如下一些缺点:

1) 高内存和I/O消耗:随着输入数据集规模的增大,由于算法将整个数据集加载到内存,对内存和I/O消耗较高;

2) 对输入参数Eps敏感:邻域半径Eps 是由用户在进行聚类前指定的,但实际上,在没有关于数据集的领域知识的指导下,很难确定合适的参数。然而聚类结果却与该参数有着很大关系:如果Eps过大,就可能将距离较远的几个簇合并起来,或者将噪声数据添加到簇中;如果过小,就可能把一个簇分割成几个更小的簇,或者将有用的数据识别为噪声。

为了辅助参数Eps 的确定,DBSCAN 算法提供了一种可视化的方法:给定k值,计算数据库中每个对象与其第k 最近邻居之间的距离kdist,并对kdist 值由大到小排序,随后以对象在排序后的kdist 序列中的序号作为横坐标,对应的kdist值(图中为4dist)作为纵坐标,绘制出二维kdist 曲线图。用户将kdist曲线由陡峭转为平缓的拐点处的kdist 值设置为参数Eps。在实际操作中,通过这种交互式方法确定的Eps 具有一定的合理性,但需要过多的人工参与。

3) 不能有效地对密度差异较大的数据集进行聚类:如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。

四 用Scikit-learn学习DBSCAN聚类算法

在scikit-learn中,我们直接使用sklearn-cluster.DBSCAN调用封装好的DBSCAN聚类函数。

我们随机生成一组数据样本点,其中两组数据是非凸的,一组为凸的。代码如下所示:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasetsX1, y1=datasets.make_circles(n_samples=1000, factor=.7,noise=.035)
X2, y2 = datasets.make_blobs(n_samples=500, n_features=2, centers=[[1.5,1.5]], cluster_std=[[.075]],random_state=9)X = np.concatenate((X1, X2))
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()

其点分布如下:

使用K-Means聚类

看一下K-means算法的分类效果,假设分为三类,代码如下:

from sklearn.cluster import KMeans
y_pred = KMeans(n_clusters=3, random_state=9).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

下面的K-means聚类效果图很明显,并不是我们想要的聚类结果。

使用DBCAN进行聚类

DBSCAN的初始函数的参数,初始化函数如下

_int_(eps=0.5, min_samples=5, metric='euclidean', algorithm='auto', leaf_size=30, p=None, n_jobs=1)

[eps] DBSCAN算法参数,两个样本被看作邻居的最大距离,即扫描半径,默认值是0.5。但是eps如果选择过大,则会有很多的样本点落入核心对象的邻域内,这时就会导致划分的类别减少;而如果eps选择过小,就会导致划分的类别增多,本来是一类的样本可能就会被分开。

[min_samples] 即前面提到的MinPts参数,作为核心对象邻域中的最小样本数,默认值是5。通常和eps一起调参。而且在eps值一定的情况下,min_sample偏大,则核心对象会减少,这时本来是一类的样本可能会被标记为噪音点,类别也会变多。反之min_sample偏小的话,核心对象就会增多,导致划分的类别减少。

[algorithm]最近邻搜索算法参数,有四种“auto,ball_tree,kd_tree,brute”,一般使用默认的“auto”就够了,它会从其他三个算法中做权衡,选择一个拟合最好的最优算法。但是如果输入样本是稀疏的,则会自动选择“brute”算法搜索。

[metric,leaf_size,p,n_jobs]对于这几个参数,可以参考前面KNN算法一文中的详细介绍,这里不再做说明。

上述介绍了DBSCAN函数的参数后,我们开始对输入的参数进行调整。从默认函数的分类效果可以发现,划分的类别比我们期望的少,那么可以通过增大min_samples,减小eps半径来达到我们的目的:

from sklearn.cluster import DBSCAN
y_pred = DBSCAN(eps=0.1,min_samples = 10).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

那么我们再来看看这时的聚类效果图如何吧:

明显的,与我们期望的划分结果完全符合。

总结

本文从DBSCAN算法的基本原理讲起,中间介绍了DBSCAN的算法流程,并在末节用实战展示了DBSCAN和KMeans的区别和使用。DBSCAN在特征工程中对于发现噪音点也有使用场景,是使用比较广泛的一种聚类方式。

原文链接

DBSCAN聚类算法探索​mp.weixin.qq.com

dbscan算法_DBSCAN聚类算法探索相关推荐

  1. 图解机器学习算法(13) | 聚类算法详解(机器学习通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...

  2. 机器学习算法-KMeans聚类算法解析及伪代码实现。

    机器学习算法-KMeans聚类算法解析及伪代码实现. 徐小狗在文末附上了几条大神们关于KMeans聚类算法的博文,欲详细研究请前往浏览~ 作为初学者,许多地方可能笨拙或有误,希望有大神看到后给予优化和 ...

  3. 单链聚类算法_聚类算法总结

    1      什么是聚类算法? 聚类算法就是根据特定的规则,将数据进行分类.分类的输入项是数据的特征,输出项是分类标签,它是无监督的. 常见的聚类规则包括:1)基于原型的,例如有通过质心或中心点聚类, ...

  4. Interview:算法岗位面试—10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法、回归算法、聚类算法等细节考察

    ML岗位面试:10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法.回归算法.聚类算法等细节考察 Interview:算法岗位 ...

  5. 《MATLAB智能算法30个案例》:第20章 基于遗传模拟退火算法的聚类算法

    <MATLAB智能算法30个案例>:第20章 基于遗传模拟退火算法的聚类算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析& ...

  6. 聚类算法--近邻聚类算法(C++实现)

    聚类算法–近邻聚类算法(C++实现) 写在前面: ​ 最近邻聚类算法,应该不是KNN,也不是K-means,就是一个特别基础的算法,但是在CSDN没有找到C++实现的这个算法,只有一个python写的 ...

  7. AI中分类算法与聚类算法

    学习数据挖掘的朋友,对分类算法和聚类算法都很熟悉.无论是分类算法还是聚类算法,都有许多具体的算法来实现具体的数据分析需求.很多时候,我们难以判断选择分类或者聚类的场合是什么.我们最直观的概念是,分类和 ...

  8. 聚类算法——层次聚类算法

    每篇一句: You must strive to find your own voice. Because the longer you wait to begin, the less likely ...

  9. 跳一跳j算法ava代码_DBSCAN聚类算法的理解与应用

    在前面的文章中,我们讲了KNN算法的原理与简单应用,KNN一种有监督学习的分类算法,也就是说该算法首先需要训练数据来进行学习之后才能对数据进行分类.在本文中我们讲到的DBSCAN聚类算法,也属于一种数 ...

最新文章

  1. iis7.5 php 404.17,win2008 r2中IIS7.5及以上设置404错误页面的正确方法
  2. CentOs7下lnmp环境安装
  3. [scala-spark]12. RDD行动操作
  4. python中的pandas的两种基本使用_pandas中join()的两种应用方法
  5. python把单词拆成字母_如何在Python里把独立字母组成单词
  6. 怎么做mysql查询系统_mysql数据库系统学习(一)---一条SQL查询语句是如何执行的?...
  7. 执行sql语句_SQL查询语句的执行顺序解析
  8. 人生不可能完美因此我们要学会讲究着过
  9. Spring的Bean有哪些作用域?
  10. JDK多了一个shenandoah GC
  11. 超维android10框架什么功能,基于Android系统深度定制,努比亚阿尔法搭载α OS带来新交互...
  12. 一个大三学生对杨教授博文《关于基础,不得不说》的深入
  13. 淘宝网视频下载的方法
  14. Qt QTableView QStandardItemModel用法
  15. CREO学习笔记【钣金结构中常用的标准件】
  16. 如何在手机上查银行卡号?进来手把手教你!
  17. Linux玩dota2需要什么显卡,dota2最低配置要求 玩dota2需要什么电脑配置
  18. 俄罗斯方块(Tetris)
  19. 信修修 | 如何一眼辨别显示器好坏?电脑选机必看!
  20. [Erlang] XML处理方案

热门文章

  1. 反思代码能力提升点:写链接不要写带域名的 一换环境就要改
  2. 反思快速完成功能代码
  3. lisp java_ai lisp java
  4. 服务器工具个人免费版下载使用,xshell个人免费版,xftp个人免费版
  5. 社会化图标html,[CSS]响应式社会化分享按钮
  6. mysql集群session_Jetty9.2.2集群Session共享
  7. 计算机应用板块还有行情吗,今日股市行情资金收评:计算机应用板块资金流出居前...
  8. gorm 密码字段隐藏_非常专业且免费的密码管理工具
  9. mybatis plus 链式编程查询
  10. python安装失败0x80070570_固态硬盘装win7出现错误代码0x80070570怎么办