MiniBatchKMeans.fit 和 MiniBatchKMeans.partial_fit 之间的差异

Eyp*_*ros 6 python scikit-learn

sklearn.cluster.MiniBatchKMeans对使用庞大数据集的一种方式感兴趣。反正我是有点困惑之间的差异MiniBatchKMeans.partial_fit()MiniBatchKMeans.fit()

有关文档fit()说明:
通过将 X 分块为小批量来计算 X 上的质心。

而有关文档partial_fit()说明:
更新 k 意味着对单个小批量 X 的估计。

因此,据我所知,它将fit()数据集拆分为训练 k 均值的数据块(我猜参数batch_sizeMiniBatchKMeans()指这个),同时partial_fit()使用传递给它的所有数据来更新中心。术语“更新”可能看起来有点模棱两可,表明fit()是否应该执行初始训练(使用),但从文档中的示例来看,这不是必需的(我也可以partial_fit()在开始时使用)。

partial_fit()无论大小如何,都将使用传递给它的所有数据,或者数据大小是否绑定到batch_size作为参数传递给MiniBatchKMeans构造函数的参数,这是真的吗?此外,如果batch_size设置为大于实际数据大小,结果与标准 k-means 算法相同(我猜在后一种情况下效率可能会有所不同,但由于架构不同)。

llp*_*kio 1

长话短说

partial_fit用于在线聚类,用于fit离线聚类,但是我认为MiniBatchKMeans的partial_fit方法有点粗糙。

长解释

我从 repo 中挖掘了旧的 PR,发现了这个,它似乎是这个实现的第一次提交,它提到这个算法可以将该partial_fit方法实现为在线聚类方法(在在线 API 讨论之后)。

因此,与BIRCH实现一样,该算法也使用fit一次性离线聚类和partial_fit在线聚类。

然而,我做了一些测试,通过使用整个数据集中的拟合与使用partial_fit和块拟合来比较结果标签的ARI,但似乎没有取得任何成果,因为ARI结果非常低(~0.5),并且通过改变初始化显然拟合分块击败了partial_fit,这是没有意义的。你可以在这里找到我的笔记本。

所以我的猜测是,基于PR 中的回应:

我相信这个分支可以而且应该合并。

在线拟合 API (partial_fit) 可能需要成熟,但我认为它有点超出了这项工作的范围。核心贡献是小批量 K 均值,它很好,而且似乎确实加快了速度。

自 PR 以来,实现没有太大变化,partial_fit 方法仍然有点粗糙,2011 年和现在的两个实现都发生了变化(与发布标记相比),但是它们都调用了该函数_mini_batch_step一次partial_fit(没有详细信息)并多次调用fit(有详细信息)。