我们如何解释 DBSCAN 聚类的输出?

数据挖掘 机器学习 Python scikit-学习 聚类 数据库扫描
2021-09-30 14:27:12

我开始学习DBSCAN聚类,但它的解释部分似乎很难理解。

dataset = np.vstack((quotient_times, quotient)).T

scaler = StandardScaler()
dataset = scaler.fit_transform(dataset)

db_scan = DBSCAN(eps=0.6, min_samples=1)
db_scan.fit(dataset)

colors = [int(i % 23) for i in db_scan.labels_]

plt.figure();
plt.title(fname)
plt.xlabel("time")
plt.ylabel("quotient")
plt.scatter(dataset[:, 0], dataset[:, 1], c=colors)
plt.legend()
plt.show()

这将产生以下图。

在此处输入图像描述

当我打印 的值时db_scan.labels_,我得到

array([0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1])

我期待我的 y 轴值从 0-1 和 x 轴值从 1-7。为什么我在 x 轴和 y 轴上都有负刻度?我们如何解释这些值和情节?

2个回答

不要盲目地从互联网上复制代码。

您复制了缩放数据的代码。因此,轴发生了变化。但这不是 DBSCAN,而是您调用 StandardScaler。

了解自己在做什么很重要……你有一个时间轴和一个价值轴。这些是完全不同的,计算欧几里得距离没有任何意义......

您可能想要对此类数据执行的操作是 GDBSCAN。对于广义 DBSCAN,您将定义两个 epsilon 阈值:

  1. 一个时间阈值:相隔多少时间步仍然是同一个集群?
  2. 价值观的一个门槛:有什么不同的价值观仍然是同一个集群?
  3. min_samples应始终至少为 3,否则您不是在做 DBSCAN,而是在做单链路集群。

然后在上面运行 GDBSCAN。

由于 sklearn 没有 GDBSCAN,因此您可以在此处通过缩放和最大范数来模拟,但这有点 hackish。

的输出db_scan.labels_是您作为算法输入提供的每个点的指定聚类值。

你提供了 20 分,所以有 20 个标签。相关文档中所述,您将看到:

labels_ : array, shape = [n_samples] 给 fit() 的数据集中每个点的聚类标签。嘈杂的样本被赋予标签-1。

因此,您的每个点都被分配到两个集群之一,并且没有标记为噪声的点(接收值为-1)。


解释集群

您的绘图显示原始数据,使用原始值绘制在轴上;只有颜色对分配每个点的集群进行编码。

与许多聚类算法一样,DBSCAN 测量一些 n 维空间中点之间的距离。它使用您提供的参数来确定点是否属于同一组,基于它们之间的距离。

为什么我在 x 轴和 y 轴上都有负刻度?

使用的距离度量并不真正关心点的符号(它们位于轴上的位置),只关心距离。在 DBSCAN 的情况下,它是欧几里得距离。还有其他距离可以传递给metricDBSCAN 算法的参数;这是有效的清单