欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

dbscan算法_DBSCAN聚类算法探索

发布时间:2024/9/15 编程问答 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 dbscan算法_DBSCAN聚类算法探索 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

作者:单华

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聚类算法探索的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。