![80cab062b10102a9b8e65cb1b99afc29.png](https://i-blog.csdnimg.cn/blog_migrate/c95d8afed83b3fed1c7c30846c52effb.jpeg)
总览
- DBSCAN聚类是一种针对无监督学习问题而被低估但非常有用的聚类算法
- 了解DBSCAN集群如何工作,为什么要学习以及如何在Python中实现DBSCAN集群
介绍
掌握无监督学习为数据科学家开辟了广泛的途径。广阔的无监督学习范围如此之广,但是许多机器学习的初学者却倾向于回避它。实际上,我相信大多数新手都会坚持使用基本的聚类算法,例如K-Means聚类和分层聚类。
尽管这种方法没有什么错,但是它确实限制了您在面对集群项目时可以做的事情。当为什么通过学习功能强大的DBSCAN聚类算法来扩展学习,知识和技能时,为什么还要限制自己呢?
集群是机器学习中的一项必不可少的技术,已在各个领域和行业中广泛使用(想想Uber的路线优化,亚马逊的推荐系统,Netflix的客户细分等)。本文适用于希望为其萌芽的机器学习技能集(DBSCAN集群)添加宝贵算法的任何人!
![181354282b897482409c5ca0e4346ec3.png](https://i-blog.csdnimg.cn/blog_migrate/b49a273362916bc85d25b8f801f543db.jpeg)
在这里,我们将学习流行且强大的DBSCAN集群算法,以及如何在Python中实现它。有很多要解压的东西,所以让我们开始吧!
目录
- 为什么我们需要DBSCAN集群?
- DBSCAN集群到底是什么?
- 可达性和连通性
- 参数选择
- 在Python中实现DBSCAN集群
- 应用聚类算法
为什么我们需要DBSCAN集群?
这是一个相关的问题。我们已经有了基本的聚类算法,那么为什么还要花时间和精力学习另一种聚类方法呢?这是一个公平的问题,因此在谈论什么是DBSCAN集群之前,让我回答一下。
首先,让我们澄清集群的作用。
聚类是一种无监督的学习技术,我们尝试根据特定特征对数据点进行分组。有多种聚类算法, 其中最常用的是K-Means 和 Hierarchical。集群算法的一些用例包括:
- 文件丛集
- 推荐引擎
- 图像分割
- 市场细分
- 搜索结果分组
- 和异常检测。
所有这些问题都使用群集的概念来达到其最终目标。因此,了解群集的概念至关重要。但是这是这两种聚类算法的问题。
K均值和层次聚类均无法创建任意形状的聚类。它们无法根据不同的密度形成簇。这就是为什么我们需要DBSCAN集群。
让我们尝试通过一个例子来理解它。在这里,我们以同心圆的形式密集存在数据点:
![e4febecdc2c4deece711c48d7d28a903.png](https://i-blog.csdnimg.cn/blog_migrate/41c5719ac2b77409ef3b883df189c65c.jpeg)
在这里,我们可以看到以同心圆的形式出现的三个不同的密集簇,并带有一些噪声。现在,让我们运行K-Means和Hierarchical聚类算法,看看它们如何聚类这些数据点。
![191176e4fdd3d10e6503df46db112157.png](https://i-blog.csdnimg.cn/blog_migrate/824e6324f8a44899df1010786fc389b0.jpeg)
您可能想知道为什么图形中有四种颜色?正如我之前所说的,该数据也包含噪声,因此,我将噪声视为由紫色表示的不同簇。可悲的是,他们两个都未能对数据点进行聚类。而且,他们无法正确检测数据集中存在的噪声。现在,让我们看一下DBSCAN集群的结果。
![e5b4f8b1075dc397f31a9857c9ddeceb.png](https://i-blog.csdnimg.cn/blog_migrate/075992ab57955fbe8fca4e5d09fe1e3a.jpeg)
太棒了!DBSCAN不仅能够正确地聚类数据点,而且还可以完美地检测数据集中的噪声。
DBSCAN集群到底是什么?
DBSCAN 代表 d ensity- 乙 ASED 小号(ε2) Ç上光的 甲 pplications与 Ñ瓦兹。
![b94907ba02263d87b903c9a7ac1eb12e.png](https://i-blog.csdnimg.cn/blog_migrate/52c181b6795cfd9ee389f6fd51d72379.jpeg)
它是由Martin Ester等人提出的。DBSCAN是在1996年提出的。DBSCAN是一种基于密度的聚类算法,其工作原理是假设聚类是空间中由较低密度区域隔开的密集区域。
它将“密集分组”的数据点分组到单个群集中。它可以通过查看数据点的局部密度来识别大型空间数据集中的聚类。DBSCAN集群最令人兴奋的功能是它对异常值具有鲁棒性。它也不需要事先告知簇的数量,这与K-Means不同,在K-Means中,我们必须指定质心的数量。
DBSCAN仅需要两个参数: epsilon 和 minPoints。 Epsilon是要在每个数据点周围创建以检查密度的圆的半径, minPoints是该圆内要将该数据点分类为核心点所需的最小数据点数。
在更高维度上,圆成为超球面,ε成为该超球面的半径, minPoints是该超球面内所需的最小数据点数。
听起来令人困惑?让我们借助示例来了解它。
![911a86f68390a3853acada0f21d539ab.png](https://i-blog.csdnimg.cn/blog_migrate/d1a810f5847793adceb38dd679ff42d5.png)
在这里,我们有一些用灰色表示的数据点。让我们看看DBSCAN如何将这些数据点聚类。
DBSCAN 在每个数据点周围创建一个epsilon半径圆,并将其分类为 Core point, Border point和 Noise。如果数据点周围的圆至少包含“ minPoints”个点,则该数据点为 核心点。如果点数小于 minPoints,则将其分类为 边界点;如果在epsilon 半径内的任何数据点周围没有其他数据点 ,则将其视为 Noise。
![a72bf99bca56c02f7b2cc0629a01e3a5.png](https://i-blog.csdnimg.cn/blog_migrate/eb9c5d19644f7401455ff6ce8660df4a.png)
上图显示了由DBCAN创建的一个minPoints = 3的集群。在这里,我们在每个数据点周围绘制一个半径相等的ε圆。这两个参数有助于创建空间簇。
包括自身在内的圆中至少包含3个点的所有数据点均被视为由红色表示的核心点。包括自身在内的所有小于3点但大于1点的数据点均视为边界点。它们用黄色表示。最后,圆内没有其他点的数据点被视为由紫色表示的噪声。
为了定位空间中的数据点,DBSCAN使用欧几里得距离,尽管也可以使用其他方法(例如地理数据的大圆距)。它还需要扫描整个数据集一次,而在其他算法中,我们必须多次扫描。
可达性和连通性
这是在继续进行之前需要了解的两个概念。可达性说明是否可以从另一个数据点直接或间接访问一个数据点,而连通性说明两个数据点是否属于同一群集。在可达性和连接性方面,DBSCAN中的两个点可以称为:
- 可直接达到密度
- 可达到密度
- 密度连接
让我们了解它们是什么。
的点 X 是 直接密度可达 从点 ÿ WRT ε,minPoints 如果
- X 属于Y 的邻域,即dist(X,Y)<= epsilon
- Y 是核心
![62fb56bc361622b55ecdfc22cbad1bf5.png](https://i-blog.csdnimg.cn/blog_migrate/085e7015d438c20ae10b003d283fe61a.png)
在此,X可从Y直接达到密度,但反之则无效。
的点 X 是 密度可达 从点 ÿ WRT ε,minPoints 如果存在点P1,P2,P3,...,Pn和P1 =链X 和PN = ÿ 使得PI + 1是直接密度可达从PI 。
![89f703ab96b3fb84b6836ef497a85c4a.png](https://i-blog.csdnimg.cn/blog_migrate/05700f866031fac8bff5eb5b38a355e0.png)
在这里,X是密度可达的距离Ÿ与X直接是密度可达的距离P2,P2从P3,以及P3从Y.但是,这种反向是无效的。
的点 X 是 密度相连 从点 ÿ WRT ε和minPoints 如果存在点直径:使得两个X和ÿ是密度可达从ø WRT到 ε和minPoints。
![82eded02b1fa56488e9cc1398cd5cf82.png](https://i-blog.csdnimg.cn/blog_migrate/3fccbeaf405965da2ff8c57751430ac0.png)
在这里,X和Y都可以从O到达密度,因此,可以说X是从Y进行密度连接的。
DBSCAN集群中的参数选择
DBSCAN对epsilon和minPoints的值非常敏感。因此,了解如何选择epsilon和minPoints的值非常重要。 这些值的微小变化会大大改变DBSCAN算法产生的结果。
minPoints的值 应至少比数据集的维数大1,即
minPoints> = Dimensions + 1 。
将minPoints设为1是没有意义的, 因为它将导致每个点成为一个单独的群集。因此,它必须至少为3。通常,它是尺寸的两倍。但是领域知识也决定了它的价值。
epsilon的值 可以从K距离图中确定。此图中的最大曲率点(弯头)告诉我们有关epsilon的值。如果选择的epsilon值 太小,则会创建更多的簇,并且会将更多的数据点视为噪声。而如果选择的太大,则各种小集群将合并为一个大集群,而我们将丢失详细信息。
在Python中实现DBSCAN集群
现在,是实施时间了!在本节中,我们将对数据集应用DBSCAN聚类,并将其结果与K-Means和层次聚类进行比较。
第1步-
让我们从导入必要的库开始。
导入numpy 作为np
导入熊猫作为pd
导入数学
导入matplotlib.pyplot 作为plt
导入matplotlib
第2步-
在这里,我正在创建仅具有两个功能的数据集,以便我们可以轻松地对其进行可视化。为了创建数据集,我创建了一个PointInCircum函数,该函数将数据点的半径和数量作为参数,并返回一个数据点数组,在绘制时形成一个圆。我们在正弦和余弦曲线的帮助下进行此操作。
np.random.seed(42 )
#以圆弧形式创建数据点的函数
def PointsInCircum (r ,n = 100 ):
return [(math.cos(2 * math.pi / n * x)* r + np.random.normal(-30 ,30 ),math.sin(2 * math.pi / N * X)* R + np.random.normal(-30 ,30 ))为X 在范围(1 ,N + 1 )]
第三步
一个圆圈不足以看到DBSCAN的聚类能力。因此,我创建了三个不同半径的同心圆。另外,我将为数据添加噪声,以便我们可以看到不同类型的聚类算法如何处理噪声。
#在一个圆的形式创建的数据点
DF = pd.DataFrame(PointsInCircum(500 ,1000 ))
DF = df.append(PointsInCircum(300 ,700 ))
DF = df.append(PointsInCircum(100 ,300 ))
#将噪声添加到数据集
DF = df.append([(np.random.randint(-600 ,600 ),np.random.randint(-600 ,600 ))为我在 范围(300 )])
![e25d7b3714f85d377b96edda8d444c57.png](https://i-blog.csdnimg.cn/blog_migrate/3609c3999b052bf80f847c0bd5d71cda.png)
第4步-
让我们绘制这些数据点并查看它们在要素空间中的外观。在这里,我使用散点图绘制这些数据点。使用以下语法:
plt.figure(figsize =(10 ,10 ))
plt.scatter(DF [ 0 ],DF [ 1 ],S = 15 ,颜色= '灰色' )
plt.title('数据集' ,字体大小= 20 )
PLT。 xlabel('Feature 1' ,fontsize = 14 )
plt.ylabel('Feature 2' ,fontsize = 14 )
plt.show()
![e4febecdc2c4deece711c48d7d28a903.png](https://i-blog.csdnimg.cn/blog_migrate/41c5719ac2b77409ef3b883df189c65c.jpeg)
完善!这对于群集问题非常有用。
K-Means,分层,DBSCAN集群
1. K-均值
我们首先从K-Means开始,因为它是最简单的聚类算法
从sklearn.cluster 导入KMeans
k_means = KMeans(n_clusters = 4 ,random_state = 42 )
k_means.fit(df [[0,1]])
![86c7257fd26b501aac49ac9d01b2b7a0.png](https://i-blog.csdnimg.cn/blog_migrate/6d5063909f823fa1581858acc1e53154.png)
现在该看看结果了。使用labels_检索标签。我已将这些标签添加到新列中的数据集中,以使数据管理变得更加容易。但是不用担心–我将仅使用数据集的两列来拟合其他算法。
df [ 'KMeans_labels' ] = k_means.labels_
#绘制所得簇
plt.figure(figsize =(10 ,10 ))
plt.scatter(DF [ 0 ],DF [ 1 ],C = DF [ 'KMeans_labels' ],CMAP = matplotlib.colors.ListedColormap(颜色), s = 15 )
plt.title('K-Means聚类' ,fontsize = 20 )
plt.xlabel('Feature 1' ,fontsize = 14 )
plt.ylabel('Feature 2' ,fontsize = 14 )
plt.show()
![b496b8f3bac1822ff3d46337e26d4c18.png](https://i-blog.csdnimg.cn/blog_migrate/fb829840cfeee2c98b1bfc5b6f011f93.jpeg)
在这里,K均值未能将数据点聚类为四个聚类。另外,它在噪音方面也不能很好地工作。因此,现在该尝试另一种流行的聚类算法,即层次聚类。
2.层次聚类
对于本文,我正在执行聚集聚类,但是还有另一种类型的层次聚类算法,称为除以聚类。使用以下语法:
从sklearn.cluster 进口AgglomerativeClustering
模型= AgglomerativeClustering(n_clusters = 4 ,亲和力= '欧几里得' )
model.fit(DF [[ 0 ,1 ]])
![4a5149b3b8953147fa66bacaf6b5cdcb.png](https://i-blog.csdnimg.cn/blog_migrate/1d234580b7778dbbc4d489b54942b869.png)
在这里,我从聚集聚类模型中获取标签,并使用散点图绘制结果。这与我对KMeans所做的类似。
DF [ 'HR_labels' ] = model.labels_
#绘图所得簇
plt.figure(figsize =(10 ,10 ))
plt.scatter(DF [ 0 ],DF [ 1 ],C = DF [ 'HR_labels' ],CMAP = matplotlib.colors.ListedColormap(colors),s = 15 )
plt.title('Hierarchical Clustering' ,fontsize = 20 )
plt.xlabel('Feature 1' ,fontsize = 14 )
plt.ylabel('Feature 2' ,fontsize = 14 )
plt.show()
![1049bdc0b4b2e27e67299f43038f4118.png](https://i-blog.csdnimg.cn/blog_migrate/2a887b17aff9f3c9db502e78729efeb9.jpeg)
可悲的是,分层聚类算法也未能正确地对数据点进行聚类。
3. DBSCAN集群
现在,是时候实施DBSCAN并了解其功能了。从sklearn.cluster导入DBSCAN 。让我们首先运行DBSCAN,不进行任何参数优化,然后查看结果。
从sklearn.cluster导入DBSCAN dbscan = DBSCAN() dbscan.fit(df [[0,1]])
![fc97bfb2de2a2bbf1eb0f496ffec69f2.png](https://i-blog.csdnimg.cn/blog_migrate/9c2b2ba551ca5a3aaf80c46ac15b5e3e.png)
在这里, epsilon为0.5,min_samples或minPoints为5。让我们直观地看一下该模型的结果:
df ['DBSCAN_labels'] = dbscan.labels_ #绘制结果集群 plt.figure(figsize =(10,10)) plt.scatter(df [0],df [1],c = df ['DBSCAN_labels'],cmap = matplotlib.colors.ListedColormap(colors),s = 15) plt.title('DBSCAN Clustering',fontsize = 20) plt.xlabel('功能1',fontsize = 14) plt.ylabel('Feature 2',fontsize = 14) plt.show()
![4ee9d743c5eb81321dc218895cc2b9d2.png](https://i-blog.csdnimg.cn/blog_migrate/abc8783ede372bea49d41427d1af1cba.jpeg)
有趣!现在,所有数据点均为紫色,这意味着它们被视为噪声。这是因为epsilon的值非常小,我们没有优化参数。因此,我们需要找到epsilon和 minPoints的值, 然后再次训练我们的模型。
对于epsilon,我使用的是K距离图。为了绘制K距离图,对于数据集中的所有数据点,我们需要一个点与其最近的数据点之间的距离。我们使用sklearn.neighbors中的NearestNeighbors 获得此值。
从sklearn.neighbors 导入NearestNeighbors
嘶= NearestNeighbors(N_NEIGHBORS = 2 )
NBRS = neigh.fit(DF [[ 0 ,1 ]])
距离,索引= nbrs.kneighbors(DF [[ 0 ,1 ]])
distance变量包含数据集中所有数据点的数据点与其最接近的数据点之间的距离的数组。
![93abf4d7834f8c3d3d26b1d86f7b11d9.png](https://i-blog.csdnimg.cn/blog_migrate/2a7d3543f5cfe1bcdad557fbdc91950d.png)
让我们绘制我们的K距离图并找到epsilon的值 。使用以下语法:
#绘图K-距离格拉夫
距离= np.sort(距离,轴= 0 )
的距离=距离[:,1 ]
plt.figure(figsize =(20 ,10 ))
plt.plot(距离)
plt.title(“K -distance Graph' ,fontsize = 20 )
plt.xlabel('数据点按距离排序' ,fontsize = 14 )
plt.ylabel('Epsilon' ,fontsize = 14 )
plt.show()
![5e63b00165ba6b5a65ec164bdaea8e77.png](https://i-blog.csdnimg.cn/blog_migrate/973abcf18ccc4c5132060c5d5a8383e6.png)
epsilon的最佳值 位于K距离图中的最大曲率点,在这种情况下为30。现在是时候找到minPoints的值了。minPoints的值还取决于域知识。这次我将minPoints设为6:
从sklearn.cluster 进口DBSCAN
dbscan_opt = DBSCAN(EPS = 30 ,min_samples = 6 )
dbscan_opt.fit(DF [[ 0 ,1 ]])
![442b4cae39b27945aca2820189cea263.png](https://i-blog.csdnimg.cn/blog_migrate/a551c9c2fbf1acb8040c6758e4d511a0.png)
df [ 'DBSCAN_opt_labels' ] = dbscan_opt.labels_
df [ 'DBSCAN_opt_labels' ] .value_counts()
![b76d8d2e4a44042eb722f061f1f12788.png](https://i-blog.csdnimg.cn/blog_migrate/50e09bc84c549f97e70fc0764db625f4.png)
DBSCAN最令人惊奇的是,它可以很好地将噪声与数据集分离开。在这里,0、1和2是三个不同的群集,而-1是噪声。让我们绘制结果并查看得到的结果。
#绘制所得簇
plt.figure(figsize =(10 ,10 ))
plt.scatter(DF [ 0 ],DF [ 1 ],C = DF [ 'DBSCAN_opt_labels' ],CMAP = matplotlib.colors.ListedColormap(颜色) ,s = 15 )
plt.title('DBSCAN Clustering' ,fontsize = 20 )
plt.xlabel('Feature 1' ,fontsize = 14 )
plt.ylabel('Feature 2' ,fontsize = 14 )
plt.show()
![e5b4f8b1075dc397f31a9857c9ddeceb.png](https://i-blog.csdnimg.cn/blog_migrate/075992ab57955fbe8fca4e5d09fe1e3a.jpeg)
DBSCAN惊人地将数据点分为三个簇,并且还检测了紫色代表的数据集中的噪声。
这里要注意的一件事很重要,那就是,尽管DBSCAN根据不同的密度创建集群,但是它却与类似密度的集群作斗争。另外,随着数据维度的增加,DBSCAN很难创建集群,并且容易受维度诅咒的影响。
尾注
因此,在本文中,我深入解释了DBSCAN聚类算法,并展示了它与其他聚类算法相比如何有用。另外,请注意,该算法还存在一个更好的最新版本,称为HDBSCAN,它将分层聚类与常规DBSCAN结合使用。它比DBSCAN更快,更准确。