如何掌握用于
机器学习的流行DBSCAN聚类算法
掌握无监督学习为数据科学家开辟了广泛的途径。广阔的无监督学习范围如此之广,但是许多机器学习的初学者却倾向于回避它。实际上,我敢肯定,大多数新手都会坚持使用基本的聚类算法,例如K-Means聚类和分层聚类。
尽管这种方法没有什么错,但是它确实限制了您在面对集群项目时可以做的事情。当您通过学习强大的DBSCAN聚类算法来扩展学习,知识和技能时,为什么还要限制自己呢?
集群是机器学习中的一项必不可少的技术,已在各个领域和行业中广泛使用(想想Uber的路线优化,亚马逊的推荐系统,Netflix的客户细分等)。本文适用于希望为他们崭露头角的机器学习技能集(DBSCAN集群)添加宝贵算法的任何人!
DBSCAN群集
在这里,我们将学习流行且强大的DBSCAN集群算法,以及如何在Python中实现它。有很多要解压的东西,所以让我们开始吧!
如果您不熟悉机器学习和无监督学习,请查看以下热门资源:
数据科学导论
目录
为什么我们需要DBSCAN集群?
DBSCAN集群到底是什么?
可达性和连通性
参数选择
在Python中实现DBSCAN集群
应用聚类算法
为什么我们需要DBSCAN集群?
这是一个相关的问题。我们已经有了基本的聚类算法,那么为什么还要花时间和精力学习另一种聚类方法呢?这是一个公平的问题,因此在谈论DBSCAN集群是什么之前,让我先回答一下。
首先,让我们清除集群的作用。
聚类是一种无监督的学习技术,我们尝试根据特定特征对数据点进行分组。有多种聚类算法, 其中最常用的是K-Means 和 Hierarchical。集群算法的一些用例包括:
文件丛集
推荐引擎
图像分割
市场细分
搜索结果分组
和异常检测。
所有这些问题都使用群集的概念来达到其最终目标。因此,了解群集的概念至关重要。但是这是这两种聚类算法的问题。
K均值和层次聚类均无法创建任意形状的聚类。它们无法根据不同的密度形成簇。这就是为什么我们需要DBSCAN集群。
让我们尝试通过一个例子来理解它。在这里,我们以同心圆的形式密集存在数据点:
dbscan集群数据集
在这里,我们可以看到以同心圆的形式出现的三个不同的密集簇,并带有一些噪声。现在,让我们运行K-Means和Hierarchical聚类算法,看看它们如何聚类这些数据点。
kmeans和层次聚类
您可能想知道为什么图形中有四种颜色?正如我之前所说的,该数据也包含噪声,因此,我将噪声视为一个不同的簇,以紫色表示。可悲的是,他们两个都未能对数据点进行聚类。而且,他们无法正确检测数据集中存在的噪声。现在,让我们看一下DBSCAN集群的结果。
dbscan集群
太棒了!DBSCAN不仅能够正确地聚类数据点,而且还可以完美地检测数据集中的噪声。
DBSCAN集群到底是什么?
DBSCAN 代表 d ensity-乙ASED 小号(ε2) ?上光的 甲pplications与 ?瓦兹。
dbscan模因
它是由Martin Ester等人提出的。DBSCAN是在1996年提出的。DBSCAN是一种基于密度的聚类算法,其假设是,聚类是空间中由较低密度区域隔开的密集区域。
它将“密集分组”的数据点分组到单个群集中。它可以通过查看数据点的局部密度来识别大型空间数据集中的聚类。DBSCAN群集最令人兴奋的功能是它对异常值具有鲁棒性。它也不需要事先告知簇数,这与K-Means不同,在K-Means中,我们必须指定质心数。
DBSCAN仅需要两个参数: epsilon 和 minPoints。 Epsilon是要在每个数据点周围创建以检查密度的圆的半径, minPoints是该圆内要将该数据点分类为核心点所需的最小数据点数。
在更高维度上,圆成为超球面,ε成为该超球面的半径, minPoints是该超球面内所需的最小数据点数。
听起来令人困惑?让我们借助示例来了解它。
dbscan数据点
在这里,我们有一些用灰色表示的数据点。让我们看看DBSCAN如何对这些数据点进行聚类。
DBSCAN 在每个数据点周围创建一个epsilon半径圆,并将其分类为 Core point, Border point和 Noise。如果数据点周围的圆至少包含“ minPoints”个点,则该数据点为 核心点。如果点数小于 minPoints,则将其分类为 边界点;如果在epsilon 半径内的任何数据点周围没有其他数据点 ,则将其视为 Noise。
dbscan群集
上图为我们展示了由DBCAN创建的具有minPoints = 3的集群。在这里,我们在每个数据点周围绘制一个半径相等的ε圆。这两个参数有助于创建空间聚类。
包括自身在内的圆中至少包含3个点的所有数据点均被视为由红色表示的核心点。包括自身在内的所有小于3点但大于1点的数据点均视为边界点。它们用黄色表示。最后,圆内没有其他点的数据点被视为由紫色表示的噪声。
为了定位空间中的数据点,DBSCAN使用欧几里得距离,尽管也可以使用其他方法(例如地理数据的大圆距)。它还需要扫描整个数据集一次,而在其他算法中,我们必须多次扫描。
可达性和连通性
这是在继续进行之前需要了解的两个概念。可达性说明是否可以从另一个数据点直接或间接访问一个数据点,而连通性说明两个数据点是否属于同一群集。在可达性和连接性方面,DBSCAN中的两个点可以称为:
可直接达到密度
可达到密度
密度连接
让我们了解它们是什么。
的点 X 是 直接密度可达 从点 ? WRT ε,minPoints 如果
X属于Y的邻域,即dist(X,Y)<= epsilon
Y是核心
直接达到密度
在此,X可直接从Y到达密度,但反之亦然。
的点 X 是 密度可达 从点 ? WRT ε,minPoints 如果存在点P1,P2,P3,...,Pn和P1 =链X 和PN = ? 使得PI + 1是直接密度可达从PI 。
密度可达
在这里,X是密度可达的距离?与X直接是密度可达的距离P2,P2从P3,以及P3从Y.但是,这种反向是无效的。
的点 X 是 密度相连 从点 ? WRT ε和minPoints 如果存在点直径:使得两个X和?是密度可达从? WRT到 ε和minPoints。
连接密度
在这里,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 )])
样本数据集
步骤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()
dbscan集群数据集
完善!这对于群集问题非常有用。
如果您想进一步了解Python的可视化功能,可以阅读以下文章:
matplotlib的Python数据可视化和探索入门指南
借助此《 Python Seaborn综合指南》,成为数据可视化专家
如何在R和Python中使用Plotly创建漂亮的交互式数据可视化?
K-Means,分层,DBSCAN集群
1. K-均值
我们首先从K-Means开始,因为它是最简单的聚类算法
从sklearn.cluster导入KMeans
k_means = KMeans(n_clusters = 4 ,random_state = 42 )
k_means.fit(df [[0
K表示聚类
现在该看看结果了。使用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(colors),s = 15 )
plt.title('K-Means Clustering' ,fontsize = 20 )
plt.xlabel('Feature 1' ,fontsize = 14 )
plt.ylabel('Feature 2' ,fontsize = 14 )
plt.show()
k表示聚类
在这里,K-means无法将数据点聚类为四个聚类。另外,它在噪音方面也不能很好地工作。因此,现在该尝试另一种流行的聚类算法,即层次聚类。
2.层次聚类
对于本文,我正在执行聚集式聚类,但是还有另一种类型的层次聚类算法,称为“分裂聚类”。使用以下语法:
从sklearn.cluster进口AgglomerativeClustering
模型= AgglomerativeClustering(n_clusters = 4 ,亲和力= '欧几里得' )
model.fit(DF [[ 0 ,1 ]])
层次聚类
在这里,我从聚集聚类模型中获取标签,并使用散点图绘制结果。这与我对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()
层次聚类
可悲的是,分层聚类算法也未能正确地聚类数据点。
3. DBSCAN集群
现在,是时候实施DBSCAN并了解其功能了。从sklearn.cluster导入DBSCAN 。让我们首先运行DBSCAN,不进行任何参数优化,然后查看结果。
从sklearn.cluster导入DBSCAN
dbscan = DBSCAN()
dbscan.fit(df [[0
dbscan集群
在这里, epsilon为0.5,min_samples或minPoints为5。让我们直观地看一下该模型的结果:
df ['DBSCAN_labels'] = dbscan.labels_
#绘制结果集群
plt.figure(figsize =(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()
dbscan集群
有趣!现在,所有数据点均为紫色,这意味着它们被视为噪声。这是因为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变量包含数据集中所有数据点的数据点与其最接近的数据点之间的距离的数组。
距离阵列
让我们绘制我们的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()
k距离图
epsilon的最佳值 位于K距离图中的最大曲率点,在这种情况下为30。现在,该找到minPoints的值了。minPoints的值还取决于域知识。这次我将minPoints设为6:
从sklearn.cluster进口DBSCAN
dbscan_opt = DBSCAN(EPS = 30 ,min_samples = 6 )
dbscan_opt.fit(DF [[ 0 ,1 ]])
dbscan集群
df [ 'DBSCAN_opt_labels' ] = dbscan_opt.labels_
df [ 'DBSCAN_opt_labels' ] .value_counts()
dbscan群集
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()
dbscan集群
DBSCAN惊人地将数据点分为三个簇,并且还检测了紫色代表的数据集中的噪声。
这里要注意的一件事很重要,那就是,尽管DBSCAN基于不同的密度创建集群,但是它却与相似密度的集群作斗争。另外,随着数据维度的增加,DBSCAN很难创建集群,并且容易受维度诅咒的影响。
题库