DBSCAN聚类算法详解

DBSCAN全称如下

Density-Based Spatial Clustering of Applications with Noise

是一种基于密度的聚类算法,所谓密度,就是说样本的紧密程度对应其类别,属于同一个cluster的样本是紧密相连的。为了定量描述紧密相连,首先引入以下3个因素

1. distance funcition, 距离的度量方式,通过距离来定量描述样本点之间的关系,这里的距离可以是欧式距离之类的计算公式

2. Epsilon, 距离的阈值,用于定义一个邻域,通过统计邻域内的样本个数来定义样本类型

3. minPoints, 领域内的最小样本数,如果大于该阈值,则将样本称之为核心样本

在DSCAN算法中,将样本划分为以下3类,图示如下

1. core point, eps邻域内的样本数大于minPoints

2. border points, eps邻域内的样本数小于minPoints

3. noise points, 噪音点,不属于任何core points的邻域内

在eps邻域和minPoints的基础上, 通过以下两个概念来描述样本的紧密相连

1. 密度直达

如下图所示

样本X在核心样本Y的邻域内,则称Y到X是密度直达的,注意这个关系是单向的,反向不一定成立

2. 密度可达

如下图所示

核心样本Y到核心样本P3是密度直达的,核心样本P3到核心样本P2是密度直达的,核心样本P2到样本X是密度直达的,像这种通过P3和P2的中转,在样本Y到样本X建立的关系叫做密度可达。

3. 密度相连

如下图所示

核心样本O到样本Y是密度可达的,同时核心样本O到样本X是密度可达的,这样的关系,我们可以说样本X和样本Y是密度相连的。

对于一系列密度可达的点而言,其邻域范围内的点都是密度相连的,下图所示是一个minPoints为5的领域,红色点为core ponit, 绿色箭头连接起来的则是密度可达的样本集合,在这些样本点的邻域内的点构成了一个密度相连的样本集合,这些样本就属于同一个cluster

DBSCAN的聚类过程就是根据核心点来推导出最大密度相连的样本集合,首先随机寻找一个核心样本点,按照minPoiints和eps来推导其密度相连的点,赋予一个cluser编号,然后再选择一个没有赋予类别的核心样本点,开始推导其密度相连的样本结合,一直迭代到所有的核心样本点都有对应的类别为止。

在scikit-learn中,使用DBSCAN聚类的代码如下

>>> from sklearn.cluster import DBSCAN
>>> from sklearn import metrics
>>> from sklearn.datasets import make_blobs
>>> from sklearn.preprocessing import StandardScaler
>>> centers = [[1, 1], [-1, -1], [1, -1]]
>>> X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4,
... random_state=0)
>>>
>>> X = StandardScaler().fit_transform(X)
>>> db = DBSCAN(eps=0.3, min_samples=10).fit(X)
>>> core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
>>> core_samples_mask[db.core_sample_indices_] = True
>>> labels = db.labels_

labels_属性记载了样本对应的cluster编号,其中编号为-1的为噪音点,上述聚类的结果可视化如下

>>> n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
>>> n_noise_ = list(labels).count(-1)
>>> import matplotlib.pyplot as plt
>>> unique_labels = set(labels)
>>> colors = [plt.cm.Spectral(each)
...           for each in np.linspace(0, 1, len(unique_labels))]
>>> for k, col in zip(unique_labels, colors):
...     if k == -1:
...         # Black used for noise.
...         col = [0, 0, 0, 1]
...     class_member_mask = (labels == k)
...     xy = X[class_member_mask & core_samples_mask]
...     plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
...              markeredgecolor='k', markersize=14)
...     xy = X[class_member_mask & ~core_samples_mask]
...     plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
...              markeredgecolor='k', markersize=6)
...
[<matplotlib.lines.Line2D object at 0x11840CE8>]
[<matplotlib.lines.Line2D object at 0x11840EB0>]
[<matplotlib.lines.Line2D object at 0x11851088>]
[<matplotlib.lines.Line2D object at 0x11851238>]
[<matplotlib.lines.Line2D object at 0x118513E8>]
[<matplotlib.lines.Line2D object at 0x11851598>]
[<matplotlib.lines.Line2D object at 0x11851748>]
[<matplotlib.lines.Line2D object at 0x118518F8>]
>>> plt.title('Estimated number of clusters: %d' % n_clusters_)
Text(0.5, 1.0, 'Estimated number of clusters: 3')
>>> plt.show()
结果如下所示

相比kmeans算法,DBSCAN算法不需要事先指定聚类的类别数目K,而且适用的范围更广泛,可以对任意形状的数据进行聚类,同时还可以发现异常值点。

·end·
(0)

相关推荐

  • 【时间序列】时间序列异常检测相关知识的总结与梳理

    异常检测(Anomaly detection)是目前时序数据分析最成熟的应用之一,定义是从正常的时间序列中识别不正常的事件或行为的过程.有效的异常检测被广泛用于现实世界的很多领域,例如量化交易,网络安 ...

  • r语言聚类分析:k-means和层次聚类

    原文链接:http://tecdat.cn/?p=2981 聚类分析算法很多,比较经典的有k-means和层次聚类法. k-means聚类分析算法 k-means的k就是最终聚集的簇数,这个要你事先自 ...

  • 军事侦察通信系统跳频信号分选(中国知网 军事侦察)

    计算机仿真2019,36(02),1-5 军事侦察通信系统跳频信号分选 陈利波龚晓峰雒瑞森陈思南 四川大学电气信息学院 导出/参考文献分享打印 摘    要: 跳频信号分选作为跳频通信侦察工作中的重要 ...

  • 机器学习,KMeans聚类分析详解

    来源:数据STUDIO 作者:Jim 大量数据中具有'相似'特征的数据点或样本划分为一个类别.聚类分析提供了样本集在非监督模式下的类别划分.聚类的基本思想是'物以类聚.人以群分',将大量数据集中相似的 ...

  • spectral-cluster聚类算法详解

    spectral clustering,称之为谱聚类算法,和近邻传播AP算法一样,也是基于图论的算法,都是将样本点两两相连,构成图这一数据结构,不同的是,谱聚类是通过切图的方式来划分不同的cluste ...

  • Affinity Propagation聚类算法详解

    Affinity Propagation简称AP, 称之为近邻传播算法, 是一种基于图论的聚类算法.将所有样本点看做是一个网络中的节点,图示如下 在样本点构成的网络中,每个样本点都是潜在的聚类中心,同 ...

  • OPTICS聚类算法详解

    DBSCAN算法对于邻域半径eps和最小样本数minPoints这两个参数比较敏感,不同的参数取值会产生不同的聚类效果.为了降低参数设置对聚类结果造成的不稳定性,在DBSCAN算法的基础上,提出了OP ...

  • BIRCH聚类算法详解

    BIRCH算法全称如下 Balanced Iterative Reducing and Clustering Using Hierarchies 属于树状结构的层次聚类算法的一种,其树状结构的构建是自 ...

  • Kmeans聚类算法详解

    输入:样本集 D = { x 1 , x 2 , x 3 , . . . , x m } D=\left \{ x_{1},x_{2},x_{3},...,x_{m} \right \} D={x1​ ...

  • CTC算法详解

    和其它文章初衷一样,网上解释很多,但是讲的不是很明白,在看完几篇参考博客后特此记录 简介 先拿语音识别任务来说,如果现在有一个包含剪辑语音和对应的文本,我们不知道如何将语音片段与文本进行对应,这样对于 ...

  • 十大排序算法详解,基本思想+动画演示+C语言实现,太肝了!

    下面的99%的代码都是手动敲出来的,参考了诸多资料,已经经过测试,可以放心食用. 1.冒泡排序 基本思想 冒泡排序基本思想是依次比较两个相邻的元素,如果顺序(如从大到小.首字母从Z到A)错误就把他们交 ...

  • 道路识别算法详解

    本文详细描述了当前代码中(git 版本: 16b521b12d2e3bdc00bd996acafe4526f1d1cb9a)道路识别的算法. 如果没有特殊说明,下文中所说的"算法" ...

  • 木工、架子工、材料用量算法详解,干货满满

    建筑工程人 11篇原创内容 公众号 一模板的计算 一.根据混凝土量快速估算模板用量 1.适用情况:一般用于工程开工前期,在已知混凝土用量的情况下估算模板用量,以初步估算工程周转材料成本投入数量,为筹措 ...