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

时间:2018-10-31 20:39:40

标签: python scikit-learn

我对sklearn.cluster.MiniBatchKMeans感兴趣,认为它是使用大型数据集的一种方式。无论如何,我对MiniBatchKMeans.partial_fit()MiniBatchKMeans.fit()之间的区别感到困惑。

关于fit()的文档指出:
通过将X上的质心分成小批来计算。

有关partial_fit()的文档指出:
更新k表示单个小批量X上的估算值。

因此,据我所知,fit()将数据集拆分为数据块,以训练k均值(我猜batch_size的参数MiniBatchKMeans()就是这个) partial_fit()使用传递给它的所有数据来更新中心。术语“更新”可能看起来有点含糊,指示是否应该执行初始训练(使用fit()),但是从documentation中的示例来看,这不是必须的(我可以使用{ {1}}的开头。)

partial_fit()是否将使用传递给它的所有数据而不论其大小是真的吗?还是将数据大小绑定到作为参数传递给partial_fit()构造函数的batch_size上?同样,如果将MiniBatchKMeans设置为大于实际数据大小,则结果将与标准k均值算法相同(我猜想,由于结构不同,后一种情况下效率可能会有所不同)。

1 个答案:

答案 0 :(得分:1)

TL; DR

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

详细说明

我从存储库中分离了旧的PR,发现this one,这似乎是该实现的第一个提交,它提到该算法可以将partial_fit方法实现为在线聚类方法(遵循在线API讨论)。

BIRCH实现一样,该算法也将fit用作一次性离线聚类,并将partial_fit用作在线聚类。

但是,我进行了一些测试,通过使用整个数据集中的拟合与使用partial_fit和大块拟合来比较结果标签的ARI,并且似乎没有任何结果,因为ARI结果是非常低(〜0.5),并且显然通过更改初始化来调整适合的块状拍子partial_fit,这没有任何意义。您可以找到我的笔记本here

所以我的猜测是基于PR中的this response

我相信该分支机构可以并且应该合并。

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

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