scikit-learn聚类:predict(X)与fit_predict(X)的区别

27
在scikit-learn中,一些聚类算法有predict(X)fit_predict(X)方法,例如KMeansMeanShift,而其他一些算法只有后者,例如SpectralClustering。根据文档:
fit_predict(X[, y]):    Performs clustering on X and returns cluster labels.
predict(X): Predict the closest cluster each sample in X belongs to.

我其实不太明白这两者之间的区别,它们对我来说似乎是等价的。


预测函数predict返回的结果与kmeans.labels_相同还是更准确? - Jack
3个回答

24
为了使用“predict”方法,您必须先使用“fit”方法。因此,使用“fit()”然后再使用“predict()”与使用“fit_predict()”完全相同。但是,在某些情况下,仅使用“fit()”可能更加有益,例如需要了解模型的初始化参数,而不是如果您使用“fit_predict()”,您将只获取在数据上运行模型的标签结果。

5
这并没有完全回答问题。他们的问题是“为什么KMeans有一个predict方法,但SpectralClustering没有……我实际上无法找出答案……也许这是一个错误/缺失的功能?我理解的是作为scikit-learn的API设计的一部分,所有分类器都应该有一个fit和一个predict方法... - maxymoo
是的,你说得对。我的回答更加倾向于“我不太明白它们之间的区别,它们对我来说似乎是等价的”的部分。 - Oer
2
那么...我们对@maxymoo的问题有回答吗? - MattS
这并没有回答问题。 - PeterBe

8

fit_predict通常用于无监督机器学习的传导估计器。

基本上,fit_predict(x)等价于fit(x).predict(x)


1
从计算机科学的角度来看,fit() 方法会影响你的对象/模型的状态,是/否?而 predict() 方法将使用现有的模型对输入数据进行标记(不会对对象/模型进行任何更改),是/否? - Trevor Boyd Smith

2

可能现在回答有点晚了,但希望能对未来的某些人有所帮助。

我认为kmeans中有predict方法而dbscan只有fit_predict方法的原因是:

  • 在kmeans中,你根据考虑到的簇数得到质心。因此,一旦你使用fit()训练了数据点,就可以使用predict()方法将新的单个数据点分配到特定的簇中。

  • 在dbscan中,没有质心,基于min_sampleseps(被视为邻居的两个点之间的最小距离)定义聚类。该算法返回所有数据点的聚类标签。这种行为解释了为什么没有predict()方法来预测单个数据点。其他用户已经解释了fit()和fit_predict()之间的区别。

在另一个空间聚类算法hdbscan中,我们可以使用approximate_predict()进行预测。值得探索一下。

这是我根据我所探索的源代码得出的理解。任何专家都可以指出任何差异。


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