为什么Scikit-learn中的k-means有一个predict函数,而DBSCAN/agglomerative没有?

7
Scikit-learn中的K-means实现具有一个可应用于未知数据的`predict()`函数,而DBSCAN和Agglomerative则没有`predict()`函数。所有三种算法都有`fit_predict()`,它用于拟合模型然后进行预测。但是,对于其他算法来说,不像k-means那样具有直接用于未知数据的`predict()`函数。
我非常清楚存在聚类算法,据我看来,K-means也不应该具有`predict()`函数。这种差异背后的可能原因是什么?仅仅因为k-means执行“1NN分类”,所以它具有`predict()`函数吗?
1个回答

6
我的解释是,差异来自于计算聚类的方式。在KMeans中,有一种本地的方法将新数据点分配给簇,而在DBSCAN或Agglomerative聚类中则没有。
A)KMeans
在KMeans中,在构建簇时,数据点被分配到最接近质心的簇中,然后更新质心。在KMeans算法中,“预测”实际上是执行分配步骤而不更新簇。
如果您假设新数据点从“训练”集中绘制,并且您的“训练”集足够代表性,则可以合理地认为可以按照算法的启发式方法分配新数据点而不更新簇质心,从而进行预测。
当然,如果数据点分布可能会改变,应该重新对更新的数据集运行KMeans聚类。
B)DBSCAN
DBSCAN通过找到数据集的高密度区域(由参数epsilon和min_points参数化)来创建聚类。这是通过计算点级属性(点是否为核心点,直接可达点,可达点或噪声点)来完成的。添加新的数据点可以修改相邻点的定义,从而使计算出的聚类过时。
例如,让我们看一下维基百科上的这个插图。在这个图像中有一个簇(红色+黄色点)和一个噪声点(蓝色)。红色点是核心点,黄色点是可达点。

DBSCAN

并考虑两种情况:

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

在这里,添加新数据点显然需要重新计算簇。

C) 聚合聚类

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

例如,如果您在sklearn中选择的链接策略是“single”,则如果两个簇的所有元素之间的最小距离低于所选阈值,则合并这些簇。您可以轻松想象一个单一放置良好的新数据点可以触发两个本来应该分开的簇之间的合并。

因此,在这里进行预测也需要重新计算簇。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接