DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法

首先来看一个例子。

想象有一个很大的广场,上面种了很多的鲜花和绿草。快要到国庆节了,园丁要把上面的鲜花和绿草打造成四个字:欢度国庆。于是园丁开始动手,用绿草作为背景去填补空白的区域,用红色的鲜花摆成文字的形状,鲜花和绿草之间都要留下至少一米的空隙,让文字看起来更加醒目。

国庆节过后,园丁让他的大侄子把这些花和草收起来运回仓库,可是大侄子是红绿色盲,不能通过颜色来判断,这些绿草和鲜花的面积又非常大,没有办法画出一个区域来告知大侄子。这可怎么办呢?

想来想去,园丁一拍脑袋跟大侄子说:“你就从一个位置开始收,只要跟它连着的距离在一米以内的,你就摞在一起;如果是一米以外的,你就再重新放一堆。” 大侄子得令,开开心心地去收拾花盆了。最后呢,大侄子一共整理了三堆花盆:所有的绿草盆都摞在一起,“国” 字用的红花摞在一起,“庆” 字用的红花摞在了一起。这就是一个关于密度聚类的例子了。

一、算法原理

DBSCAN算法将数据点分为三类:

  • 核心点:在半径Eps内含有不少于MinPts数目的点

  • 界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内

  • 噪音点:既不是核心点也不是边界点的点

上面的例子看起来比较简单,但是在算法的处理上我们首先有个问题要处理,那就是如何去衡量密度。在 DBSCAN 中,衡量密度主要使用两个指标,即半径和最少样本量。

对于一个已知的点,以它为中心,以给定的半径画一个圆,落在这个圆内的就是与当前点比较紧密的点;而如果在这个圆内的点达到一定的数量,即达到最少样本量,就可以认为这个区域是比较稠密的。

对于在整个样本空间中的样本,可以存在下面几种关系:

1、核心对象

核心对象:在一个样本对象 C CC 的 ε-邻域 中 , 有超过一定 阈值 ( 最小数量 ) 的 样本对象分布 , 那么该样本对象C就是核心对象 ;

核心对象图示:如果该阈值 ( 最小数量 ) 设置成 5 55 , 那么该 ε \varepsilonε-邻域 中有 6 66 个点 , 超过了最小阈值 , 红色 的 中心点 数据样本 是 核心对象 ;

2、直接密度可达Directly Density Reachable ( DDR )

概念 : 样本 p 是核心对象 ( 以p为中心ε-邻域 中超过阈值个数的样本 ) , 样本 q 在其ε-邻域 中 , 那么 称为p 直接密度可达q ; 注意方向 p → q , 从p 出发直接密度可达q ;

直接密度可达有两个条件 : ① 起点必须是核心对象 , ② 终点必须在起点的ε-邻域 中 ;

直接密度可达的注意点:

① 单向概念 : 注意该概念是单向的概念 ,p 样本出发 , 可以 直接密度可达q , 反过来是不行的 ; q 出发不一定能到 p ;

② 直接密度可达 起点 : 只有 核心对象 才有资格 发起密度可达 概念 , 不是核心对象 , 没有资格作为起点 ;

③ 直接密度可达 性质 : 如果 p 是核心对象 , 那么从 p 出发 , 可以直接密度可达其ε-邻域 中所有的样本点 ;

如果 p 不是核心对象 , 那么没有直接密度可达的概念

直接密度可达图示:红色点 p 是核心对象 , q 在其ε-邻域 中 , p 直接密度可达q ;

3、密度可达

密度可达 : p 密度可达q , 存在一个 由 核心对象 组成的链 , p 直接密度可达 p1 , p1 直接密度可达 p2,...,pn-1直接密度可达pn,此时称为p密度可达q

链上的核心对象要求 : 链的起点 , 和经过的点 , 必须是核心对象 , 链的最后一个点 , 可以是任意对象 ;

密度可达 与 直接密度可达区别 : 密度可达 与 直接密度可达 的概念在于 是直接可达 , 还是 间接可达 ;

密度可达图示 : p直接密度可达q , q 直接密度可达t , p 密度可达t ;

4、密度连接

密度连接:p 和 q 两个样本 , 存在一个中间样本对象 O , O 到 p 是 密度可达 的 , O 到 q 是 密度可达 的 ;

密度连接方向 : O 可以密度连接 p 和 q 样本 , 但是p 和 q不一定能走到 O , 它们可能不是核心对象 ;

核心对象要求 : O 以及到 样本 p 或者 样本 q 中间的样本都必须是核心对象 , 但是 p 和 q 两个对象不要求是核心对象, 它们可以是普通的样本点 ;

密度连接图示:下图中 , 样本点 O 密度可达 p 和 q , 那么 p 和 q 是密度连接的 ; 其中 p , q 不是核心对象 , O , p1 , p2 , q1 , q2 是核心对象;

二、处理步骤

经过了初始化之后,再从整个样本集中去抽取样本点,如果这个样本点是核心对象,那么从这个点出发,找到所有密度可达的对象,构成一个簇。

如果这个样本点不是核心对象,那么再重新寻找下一个点。 不断地重复这个过程,直到所有的点都被处理过。

这个时候,我们的样本点就会连成一片,也就变成一个一个的连通区域,其中的每一个区域就是我们所获得的一个聚类结果。

当然,在结果中也有可能存在像 G 一样的点,游离于其他的簇,这样的点称为异常点。

三、算法优缺点

1、优点

  • 不需要划分个数。 跟 K-means 比起来, DBSCAN 不需要人为地制定划分的类别个数,而可以通过计算过程自动分出。

  • 可以处理噪声点。 经过 DBSCAN 的计算,那些距离较远的数据不会被记入到任何一个簇中,从而成为噪声点,这个特色也可以用来寻找异常点。

  • 可以处理任意形状的空间聚类问题。 从我们的例子就可以看出来,与 K-means 不同, DBSCAN 可以处理各种奇怪的形状,只要这些数据够稠密就可以了。

2、缺点

  • 需要指定最小样本量和半径两个参数。 这对于开发人员极其困难,要对数据非常了解并进行很好的数据分析。而且根据整个算法的过程可以看出, DBSCAN 对这两个参数十分敏感,如果这两个参数设定得不准确,最终的效果也会受到很大的影响。

  • 数据量大时开销也很大。 在计算过程中,需要对每个簇的关系进行管理。所以当数据量大的话,内存的消耗也非常严重。

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

在使用的过程中十分要注意的就是最小样本量和半径这两个参数,最好预先对数据进行一些分析,来加强我们的判断

四、代码举例

今天我们使用的数据集不再是鸢尾花数据集,我们要使用 datasets 的另外一个生成数据的功能。

在下面的代码中可以看到,我调用了 make_moons 这个方法,在 sklearn 的官网上,我们可以看到关于这个方法的介绍:生成两个交错的半圆环,从下面的生成图像我们也能够看到,这里生成的数据结果,是两个绿色的半圆形。

我们今天调用的聚类方法是 sklearn.cluster 中的 dbscan。

from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import dbscan #今天使用的新算法包
import numpy as np
X,_=datasets.make_moons(500,noise=0.1,random_state=1) #单单用x=。。。的话最后面还会有一个类别的数组
df = pd.DataFrame(X,columns=['x','y'])
df.plot.scatter('x','y',s=200,alpha=0.5,c='green')

接下来我们就用dbscan算法来进行聚类计算,可以看到我为 dbscan 算法配置了初始的邻域半径和最少样本量。

# eps为邻域半径, min_samples为最少样本量
core_samples,cluster_ids=dbscan(X,eps=0.2,min_samples=20)
# cluster_ids中 -1表示对应的点为噪声
df= pd.DataFrame(np.c_[X,cluster_ids],columns=['x','y','cluster_id'])
# np.c 中的c 是 column(列)的缩写,就是按列叠加两个矩阵,就是把两个矩阵左右组合,要求行数相等。
df['cluster_id']=df['cluster_id'].astype('i2') #变整数df.plot.scatter('x','y',s=200,c=list(df['cluster_id']),cmap='Reds',colorbar=False,alpha=0.6,title='DBSCAN')

最后,我们使用不同的颜色来标识聚类的结果,从图上可以看出有两个大类,也就是两个月亮的形状被聚类算法算了出来。

但是眼尖的同学可能看到,在月亮两头的区域有一些非常浅色的点,跟两个类别的颜色都不一样,这里就是最后产生的噪声点,根据我们设置的参数计算,这些点不属于任何一个类别。

五、总结

DBSCAN 是基于密度的聚类方法,与前面讲的 K-means 不同的是,它可以很好地解决数据形状不规则的情况。

在算法原理环节,有几个概念需要你仔细去理解,只要明白了那几个概念,DBSCAN 算法的核心也就可握了。

总体来讲,DBSCAN 是一个比较简单明了的算法,没有太多复杂的数学运算,但是在实践中要想用好DBSCAN 却不是十分容易,这主要是因为两个初始化参数比较难以设定 。

————————————————

资料来源:CSDN博主「韩曙亮」的原创文章,附上原文出处链接及本声明。 原文链接:【数据挖掘】基于密度的聚类方法 - DBSCAN 方法 ( K-Means 方法缺陷 | 基于密度聚类原理及概念 | ε-邻域 | 核心对象 | 直接密度可达 | 密度可达 | 密度连接 )_韩曙亮的博客-CSDN博客_直接密度可达

机器学习之DBSCAN算法相关推荐

  1. dbscan算法中 参数的意义_无监督机器学习中,最常见的聚类算法有哪些?

    在机器学习过程中,很多数据都具有特定值的目标变量,我们可以用它们来训练模型. 但是,大多数情况下,在处理实际问题时,数据不会带有预定义标签,因此我们需要开发能够对这些数据进行正确分类的机器学习模型,通 ...

  2. 【机器学习】聚类算法DBSCAN、K-means、Mean Shift对比分析及具体代码实现

    [机器学习]聚类算法DBSCAN.K-means.Mean Shift对比分析及具体代码实现 一.DBSCAN算法(具有噪声的基于密度的聚类方法) 1.算法原理 基于数据分布密度不同对数据进行聚类,把 ...

  3. dbscan算法_如何掌握用于机器学习的流行DBSCAN聚类算法

    总览 DBSCAN聚类是一种针对无监督学习问题而被低估但非常有用的聚类算法 了解DBSCAN集群如何工作,为什么要学习以及如何在Python中实现DBSCAN集群 介绍 掌握无监督学习为数据科学家开辟 ...

  4. 机器学习强基计划7-5:图文详解密度聚类DBSCAN算法(附Python实现)

    目录 0 写在前面 1 密度聚类 2 DBSCAN算法 3 Python实现 3.1 算法复现 3.2 可视化实验 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用.&qu ...

  5. 机器学习8—聚类算法之DBSCAN和Birch算法

    聚类算法 一.基于密度的聚类DBSCAN算法 1.1DBSCAN算法的基本概念 1.2DBSCAN算法参数选择 1.3DBSCAN算法原理 1.4DBSCAN算法中dbscan()函数的说明 1.5D ...

  6. 机器学习知识点(十八)密度聚类DBSCAN算法Java实现

    为更好理解聚类算法,从网上找现成代码来理解,发现了一个Java自身的ML库,链接:http://java-ml.sourceforge.net/ 有兴趣可以下载来看看源码,理解基础ML算法.对于DBS ...

  7. 机器学习-常见聚类算法K-means,模糊c-均值,谱聚类 DBSCAN算法等

    聚类算法: 聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法,同时也是数据挖掘的一个重要算法. 聚类(Cluster)分析是由若干模式(Pattern)组成的,通常,模式是一个度量 ...

  8. 一文图解机器学习的基本算法!

    来源:软件定义世界 本文长度为2877字,建议阅读6分钟 本文为你分析如何选择机器学习的各种方法. 每当提到机器学习,大家总是被其中的各种各样的算法和方法搞晕,觉得无从下手.确实,机器学习的各种套路确 ...

  9. Scikit-Learn机器学习(knn算法)

    前言 博观而约取,厚积而薄发 本文中回忆了python的类概念,机器学习需要用到的环境,以及什么是Scikit-Learn 目的是方便博主进行回忆 记忆学习 和总结 如果能帮助到大家 那就更好了 Py ...

最新文章

  1. Caused by: org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Could not find a file syst
  2. 皮一皮:昨天是一个凄苦的节日...
  3. css制作圆角矩形,CSS绘制圆角矩形图形的效果
  4. 【Linux就该这么学 20期培训笔记 01】部署虚拟环境安装linux系统
  5. java jdk myeclipse_java初体验(JDK+myeclipse)
  6. Ubuntu 服务器设置软件多用户访问
  7. java异步获取结果_java获取异步计算的结果
  8. Android热修复Java类_Android 热修复(一)
  9. linux qt程序崩溃_【工程师分享】在MPSoC上运行基于eglfs_kms的QT应用程序
  10. 邮件服务器IMail教程(2)
  11. Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2问题解决
  12. python约瑟夫环单向循环链表_约瑟夫环_约瑟夫环单向循环链表_约瑟夫环c语言循环链式...
  13. MFC Windows 程序设计[二十一]之树形控件
  14. asp.net panel 加html,ASP.NET中 Panel 控件的使用方法
  15. 一位射频技术支持工程师的工作感悟
  16. linux 保存bmp 图片
  17. ubuntu 18.04.2 server基本安装配置
  18. proteus里面没有stm32怎么办_STM32难不难,如何学习?这几点老司机建议,你得好好收藏!...
  19. GDI+绘图轻松入门[5]-绘图坐标的理解和应用
  20. JAVA基于坐标点求海拔

热门文章

  1. pandas数据排序sort_values后面inplace=True与inplace=False的实例驱动理解
  2. ubuntu12.04将tgz文件解压到指定目录
  3. C语言中static变量详解
  4. Android Studio连接mysql8.0.25经验贴(三天血与泪的教训)
  5. Matlab 动态输入变量和嵌套函数、匿名函数
  6. OPENGL学习(四)GLUT三维图像绘制
  7. 人工智能在刷题学海战术中的作用
  8. 逆向思维--魔兽世界封包分析
  9. Android自定义圆形调色板,可设置属性
  10. PPI (手机屏幕的PPI 和计算方法)