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

时间:2012-08-13 17:46:45

标签: c++ matlab full-text-search cluster-analysis k-means

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

我一直在寻找这段代码的实现,但无济于事。有人知道吗?

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

  
      
  1. 图片来自实时视频,一旦保存了足够的图片,就可以获得筛选功能。
  2.   
  3. 重复步骤1,新一批实时图片,再次获得kmeans。将kmeans向量与之前的kmeans结合起来,如:[A B]
  4.   

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

我想要的是什么:

  
      
  1. 从实时视频供稿中拍摄的图像,一旦保存图片,就可以获得kmeans
  2.   
  3. 重复步骤1,再次获取kmeans,更新并将新群集添加到上一个群集。
  4.   

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

1 个答案:

答案 0 :(得分:1)

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

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

一旦你真的想重新分配先前的分数,事情会变得稍微复杂一些。但通常在流式上下文中,您不会知道以前的点数,所以无论如何都不能这样做。