机器学习之DBSCAN算法

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博客_直接密度可达  

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值