机器学习 - DBSCAN 聚类



DBSCAN 聚类算法的工作原理如下:

  • 随机选择一个尚未访问的数据点。

  • 如果该数据点在距离 eps 内至少有 minPts 个邻居,则创建一个新的聚类并将该数据点及其邻居添加到该聚类。

  • 如果该数据点在距离 eps 内至少没有 minPts 个邻居,则将该数据点标记为噪声并继续下一个数据点。

  • 重复步骤 1-3,直到访问所有数据点。

Python 实现

我们可以使用 scikit-learn 库在 Python 中实现 DBSCAN 算法。以下是操作步骤:

加载数据集

第一步是加载数据集。我们将使用 scikitlearn 库中的 make_moons 函数生成一个具有两个月亮的玩具数据集。

from sklearn.datasets import make_moons
X, y = make_moons(n_samples=200, noise=0.05, random_state=0)

执行 DBSCAN 聚类

下一步是在数据集上执行 DBSCAN 聚类。我们将使用 scikit-learn 库中的 DBSCAN 类。我们将 minPts 参数设置为 5,“eps”参数设置为 0.2。

from sklearn.cluster import DBSCAN
clustering = DBSCAN(eps=0.2, min_samples=5)
clustering.fit(X)

可视化结果

最后一步是可视化聚类结果。我们将使用 Matplotlib 库创建一个数据集的散点图,并按聚类分配着色。

import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], c=clustering.labels_, cmap='rainbow')
plt.show()

示例

以下是 DBSCAN 聚类在 Python 中的完整实现:

from sklearn.datasets import make_moons
X, y = make_moons(n_samples=200, noise=0.05, random_state=0)
from sklearn.cluster import DBSCAN

clustering = DBSCAN(eps=0.2, min_samples=5)
clustering.fit(X)

import matplotlib.pyplot as plt
plt.figure(figsize=(7.5, 3.5))
plt.scatter(X[:, 0], X[:, 1], c=clustering.labels_, cmap='rainbow')

plt.show()

输出

生成的散点图应显示两个不同的聚类,每个聚类对应于数据集中一个月亮。噪声数据点应为黑色。

DBSCAN clustering

DBSCAN 的优点

以下是使用 DBSCAN 聚类的优点:

  • 与假设聚类为球形的 k 均值不同,DBSCAN 可以处理任意形状的聚类。

  • 它不需要预先知道数据集中聚类的数量,与 k 均值不同。

  • 它可以检测异常值,即不属于任何聚类的点。这是因为 DBSCAN 将聚类定义为点的密集区域,远离任何密集区域的点被认为是异常值。

  • 与 k 均值不同,它对参数的初始选择(例如 epsilon 和 min_samples 参数)相对不敏感。

  • 它可以扩展到大型数据集,因为它只需要计算相邻点之间的成对距离,而不是所有点的成对距离。

DBSCAN 的缺点

以下是使用 DBSCAN 聚类的缺点:

  • 它可能对 epsilon 和 min_samples 参数的选择敏感。如果这些参数没有仔细选择,DBSCAN 可能会无法识别聚类或错误地合并它们。

  • 它可能不适用于密度变化的数据集,因为它假设所有聚类具有相同的密度。

  • 由于算法的非确定性性质,它可能在同一数据集上的不同运行中产生不同的结果。

  • 对于高维数据集,它可能计算成本很高,因为随着维数的增加,距离计算变得更加昂贵。

  • 如果噪声或异常值的密度过高,它可能不适用于具有噪声或异常值的数据集。在这种情况下,噪声或异常值可能会被错误地分配给聚类。

广告