顺序/在线kmeans聚类,它是如何工作的?现有代码?

Posted

技术标签:

【中文标题】顺序/在线kmeans聚类,它是如何工作的?现有代码?【英文标题】:sequential/online kmeans clustering, how does it work? Existing codes? 【发布时间】:2012-08-09 23:44:59 【问题描述】:

我对在线 kmeans 聚类有点困惑。我知道它允许我一次只使用一个数据进行聚类。但是,这一切都仅限于一个会话吗?假设我有一堆数据通过这种方法进行聚类,我得到了聚类的数据结果,我以后可以向集群中添加更多数据吗?

我也一直在寻找此代码的实现,但无济于事。有谁知道吗?

更新: 澄清更多。以下是我的代码现在的工作方式:

    图片取自实时视频源,保存足够多的图片后,获取 sift 特征的 kmeans。 重复步骤1,新一批live feed图片,再次获取kmeans。将 kmeans 向量与之前的 kmeans 相结合,例如:[A B]

你可以看到这很糟糕,因为我很快得到了太多的簇,而且每批簇肯定会与另一批重叠。

我想要什么:

    图片取自实时视频源,保存图片后,获取 kmeans 重复第 1 步,再次获取 kmeans,这会更新并将新集群添加到之前的集群。

除非我没有正确理解它们,否则我所看到的任何东西都无法适应。

【问题讨论】:

@mschonaker 最好是 matlab,但我可以使用 C++ 【参考方案1】:

如果您查看原始 (!) 出版物,MacQueen 提出的方法(k-means 名称的由来)实际上是一种在线算法。我不确定 MacQueen 是否对数据进行了多次传递以改善结果。我相信他使用了单次传递,并且对象永远不会被重新分配到不同的集群。如果是这样,那已经是在线算法了!

平均值通常计算为sum / count。从数字的角度来看,这不是很明智。例如。在经典的 Knuth 书中,您可以找到一种增量更新方式的方法。***也有。

一旦您真正想要重新分配较早的点,事情就会变得稍微复杂一些。但通常在流式上下文中,您不知道前面的要点,因此无论如何您都不能这样做。

【讨论】:

那么有什么传统的解决方案吗?这是我目前发现的唯一东西:icml.cc/2012/papers/291.pdf “常规解决方案”是什么意思? MacQueen 1967 还不够传统吗? 我不认为我很清楚自己想要什么。也许我完全错误地解决了这个问题。请看我更新的帖子 尝试仅使用新实例更新现有方法。这很简单。或者看看 MacQueen,它实际上“一次处理一个实例”。这显然也可以在流上完成。

以上是关于顺序/在线kmeans聚类,它是如何工作的?现有代码?的主要内容,如果未能解决你的问题,请参考以下文章

opencv:如何使用kmeans()按角度聚类

聚类算法——KMEANS算法

聚类——Kmeans

这个 kmeans 聚类的最佳 k 值是多少? (肘点图)

如何在不耗尽内存的情况下运行大型 Mahout 模糊 kmeans 聚类?

聚类算法kmeans