为什么 scikit learn 中的 k-means 具有预测功能但 DBSCAN/agglomerative 没有?

Why k-means in scikit learn have a predict function but DBSCAN/agglomerative doesnt?

K-means 的 Scikit-learn 实现有一个 predict() 函数,可以应用于看不见的数据。 DBSCAN 和 Agglomerative 没有 predict() 函数。

三种算法都有fit_predict()用来拟合模型然后预测。但是 k-means 有 predict() 可以直接用于看不见的数据,而其他算法则不然。

我非常清楚有聚类算法,根据我的观点,predict() 也不应该用于 K-means。

这种差异背后可能 intuition/reason 是什么?难道只是因为k-means进行了“1NN分类”,所以才有了predict()的功能?

我的解释是,差异来自聚类的计算方式。在 KMeans 中,有一种本地方法可以将新点分配给集群,而在 DBSCAN 或 Agglomerative 集群中则没有。

A) K 均值

在KMeans中,在构建集群的过程中,一个数据点被分配给最接近质心的集群,然后更新质心。 KMeans算法中的“预测”实际上是在不更新集群的情况下进行分配步骤。

如果您假设新数据点来自与“训练”集相同的分布,并且您的“训练”集具有足够的代表性,那么认为可以分配新数据点是合理的遵循算法的启发式而不更新簇质心,从而进行预测。

当然,如果数据点分布可能发生变化,则应在更新后的数据集上重新运行 KMeans 聚类。

B) DBSCAN

DBSCAN 通过查找数据集的高密度区域创建集群(由参数 epsilonmin_points 参数化) .这是通过计算点级属性(无论该点是核心点、直接可达点、可达点还是噪声点)来完成的。添加一个新的数据点可以修改相邻点的定义,从而使计算的集群过时。

举个例子,让我们看看this illustration from wikipedia, copied below。在这张图片上有一个簇(红色+黄色点)和一个噪声点(蓝色)。红色点为核心点,黄色点为可达点。

并考虑两种情况:

  • 在 A 和 N 的中间添加一个新点将使 N 成为从 A 可到达的点,从而属于集群。
  • 在 N 的 epsilon 邻域中添加 (min_points-1) 个新点,但不在其他 epsilon 邻域中(​​例如顶部的示例)图中),会改变N的状态成为核心点,并与新加入的点组成新的簇。

这里添加新的数据点显然需要重新计算集群。

C) 凝聚聚类

凝聚聚类从点开始迭代构建聚类,并根据链接度量合并它们。与 DBSCAN 类似,添加新的数据点可以完全修改最终的聚类,因为它可以触发不同的合并。

例如,如果您在 sklearn 中选择的链接策略是“单一”,则如果两个集群的所有元素之间的最小距离低于所选阈值,则合并集群。您可以很容易地发现,一个放置得当的新数据点可以触发两个本来会分开的集群之间的合并。

因此这里预测也需要重新计算聚类