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

Sau*_*rav 7 cluster-analysis machine-learning k-means dbscan scikit-learn

K-means 的 Scikit-learn 实现具有predict()可应用于未见过的数据的功能。而DBSCAN和Agglomerative则没有这个predict()功能。

这三种算法都有fit_predict(),用于拟合模型然后进行预测。但是 k-meanspredict()可以直接用于未见过的数据,而其他算法则不然。

我非常清楚有聚类算法,并且根据我的观点,predict()K 均值也不应该存在。

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

A C*_* Co 6

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

A)K均值

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

如果您假设新数据点是从与“训练”集相同的分布中抽取的,并且您的“训练”集具有足够的代表性,则可以合理地认为可以按照以下启发式分配新数据点算法无需更新簇质心,从而做出预测。

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

B) 数据库扫描

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

作为示例,让我们看一下来自维基百科的插图,复制如下。在此图像上有一个簇(红色+黄色点)和一个噪声点(蓝色)。红色点是核心点,黄色点是可达点。

数据库扫描

并考虑两种情况:

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

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

C) 凝聚聚类

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

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

因此这里预测还需要重新计算簇