ML中的DBSCAN聚类 | 基于密度的聚类


介绍

DBSCAN是Density-Based Spatial Clustering of Applications with Noise的缩写。它是一种无监督聚类算法。DBSCAN聚类可以处理来自海量数据中任意大小的集群,并且可以处理包含大量噪声的数据集。它基本上是基于一个区域内最小点数的标准。

什么是DBSCAN算法?

DBSCAN算法可以有效地将密集分组的点聚类到一个集群中。它可以识别大型数据集中数据点之间的局部密度。DBSCAN可以非常有效地处理异常值。与K-means算法相比,DBSCAN的一个优势是,在DBSCAN的情况下,不需要预先知道质心的数量。

DBSCAN算法依赖于两个参数:epsilon和minPoints。

Epsilon定义为每个数据点周围考虑密度的半径。

minPoints是在半径内需要的点数,以便数据点成为核心点。

该圆圈可以扩展到更高的维度。

DBSCAN算法的工作原理

在DBSCAN算法中,在每个数据点周围绘制一个半径为epsilon的圆,并将数据点分类为核心点、边界点或噪声点。如果数据点在epsilon半径内有minPoints个数据点,则将其分类为核心点。如果它拥有的点少于minPoints,则称为边界点;如果epsilon半径内没有点,则将其视为噪声点。

让我们通过一个例子来理解其工作原理。

在上图中,我们可以看到点A在epsilon(e)半径内没有点。因此,它是一个噪声点。点B在epsilon e半径内有minPoints(=4)个点,因此它是一个核心点。而该点只有1个(小于minPoints)点,因此它是一个边界点。

DBSCAN算法涉及的步骤。

  • 首先,找到epsilon半径内的所有点,并识别点数大于或等于minPoints的核心点。

  • 接下来,对于每个核心点,如果未分配给特定集群,则为其创建一个新集群。

  • 找到与核心点相关的所有密集连接的点,并将它们分配到同一个集群。如果两个点具有一个邻居点,并且该邻居点与这两个点之间的距离都在epsilon距离之内,则这两个点被称为密集连接点。

  • 然后迭代数据中的所有点,并将不属于任何集群的点标记为噪声。

代码实现

## DBSCAN

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
import seaborn as sns

data = pd.read_csv('/content/customers.csv')
data.rename(columns={'CustomerID':'customer_id','Gender':'gender','Age':'age','Annual Income (k$)':'income','Spending Score (1-100)':'score'},inplace=True)
features = ['age', 'income', 'score']
train_x = data[features]
cls = DBSCAN(eps=12.5, min_samples=4).fit(train_x)
datasetDBSCAN = train_x.copy()
datasetDBSCAN.loc[:,'cluster'] = cls.labels_ 
datasetDBSCAN.cluster.value_counts().to_frame()

outliers = datasetDBSCAN[datasetDBSCAN['cluster']==-1]

fig, (ax) = plt.subplots(1,2,figsize=(10,6))

sns.scatterplot(x='income', y='score',data=datasetDBSCAN[datasetDBSCAN['cluster']!=-1],hue='cluster', ax=ax[0], palette='Set3', legend='full', s=180)

sns.scatterplot(x='age', y='score',

   data=datasetDBSCAN[datasetDBSCAN['cluster']!=-1],

   hue='cluster', palette='Set3', ax=ax[1], legend='full', s=180)

ax[0].scatter(outliers['income'], outliers['score'], s=9, label='outliers', c="k")

ax[1].scatter(outliers['age'], outliers['score'], s=9, label='outliers', c="k")
ax[0].legend()
ax[1].legend()

plt.setp(ax[0].get_legend().get_texts(), fontsize='11')
plt.setp(ax[1].get_legend().get_texts(), fontsize='11')

plt.show()

输出

DBSCAN算法的优点

  • DBSCAN不需要像K-Means算法那样预先知道质心的数量。

  • 它可以找到任何形状的集群。

  • 它还可以找到与任何其他组或集群不相连的集群。它可以很好地处理噪声集群。

  • 它对异常值具有鲁棒性。

DBSCAN算法的缺点

  • 它不适用于密度不同的数据集。

  • 由于它不能被分割,因此不能与多进程一起使用。

  • 如果数据集稀疏,则无法找到正确的集群。

  • 它对参数epsilon和minPoints敏感

DBSCAN的应用

  • 它用于卫星图像。

  • 用于X射线晶体学

  • 温度异常检测。

结论

DBSCAN是一种无监督聚类技术,在处理异常值和任意形状的集群时,其性能优于其他聚类算法。DBSCAN根据距离测量将密集的区域聚类在一起。它是一种空间聚类算法,也可以很好地处理噪声数据。

更新于:2023年9月22日

7K+ 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告