Machine Learning 简明教程

Machine Learning - DBSCAN Clustering

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

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

  2. 如果数据点在距离 eps 以内至少有 minPts 个邻居,则创建一个新群集并将数据点及其邻居添加到该群集中。

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

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

Implementation in Python

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

Load the dataset

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

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

Perform DBSCAN clustering

下一步是在数据集上执行 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)

Visualize the results

最后一步是对聚类结果进行可视化。我们将使用 Matplotlib 库根据聚类分配创建数据集的散点图。

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

Example

以下是 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

Advantages of DBSCAN

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

  1. 与假设簇呈球形的 k 均值不同,DBSCAN 可以处理任意形状的簇。

  2. 与 k 均值不同,它不需要预先了解数据集中簇的数量。

  3. 它可以检测异常值,即不属于任何簇的点。这是因为 DBSCAN 将簇定义为点的密集区域,而远离任何密集区域的点则被视为异常值。

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

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

Disadvantages of DBSCAN

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

  1. 它可能对 epsilon 和 min_samples 参数的选择很敏感。如果未仔细选择这些参数,DBSCAN 可能会无法识别簇或错误地合并簇。

  2. 它可能无法很好地处理密度不同的数据集,因为它假设所有簇的密度相同。

  3. 由于该算法的非确定性,它对同一数据集进行的不同运行可能会产生不同的结果。

  4. 对于高维数据集,它可能会在计算上很昂贵,因为随着维数的增加,距离计算会变得更加昂贵。

  5. 如果噪声或异常值的密度太高,则它可能无法很好地处理具有噪声或异常值的数据集。在这种情况下,噪声或异常值可能会错误地分配给簇。