高效的动态聚类

时间:2014-07-08 07:13:02

标签: algorithm machine-learning artificial-intelligence cluster-analysis k-means

我有一组来自单位间隔的数据点(即带有数值的1维数据集)。我在线收到一些额外的数据点,而且一些数据点的值可能会动态变化。我正在寻找一种理想的聚类算法,可以有效地处理这些问题。

我知道sequential k-means clustering应对新实例的添加,我想稍微修改它可以处理动态实例值(即首先从相应的集群中获取修改后的实例,然后更新集群的均值最后将修改后的实例作为算法的输入,就像添加一个看不见的实例一样。)

我对使用k-means算法的关注是要求提供簇数作为输入。我知道他们在时间和空间复杂性方面击败了其他聚类算法(GA,MST,分层方法等)。老实说,我不确定,但也许我可以使用上述算法之一逃脱。即使我的数据集相对较大,单个维度的存在也让我感到奇怪。

更具体地说,我的典型测试案例将包含大约10K-200K的1维数据点。我想在一秒钟之内完成聚类。假设值点的动态变化是平滑的,即相对较小。因此,非常优选能够使用现有解决方案(即,当改变值或添加新值时能够继续对现有解决方案进行聚类)。

总而言之:

  

你能想到一种能够在计算效率和集群精度之间提供最佳点的算法。上面定义的问题?

     

k-means算法是否有一些很好的启发式方法可以预先自动计算K的值?

2 个答案:

答案 0 :(得分:1)

由于您的数据集是一维的,因此您可以使用一种非常简单有效的方法根据single-linkage clustering规则动态更新群集。该规则规定,只要第一个聚类中的某个点和第二个聚类中的某个点低于某个预先指定的阈值距离,就会将2个聚类连接成1。

  • 构建一个包含初始点数的binary search tree
  • 使初始O(n)按顺序通过此BST,该BST按排序顺序访问节点,以查找初始集群集:每当当前点与最后一个点之间的距离小于阈值时,添加它到上一个集群,否则启动一个新的集群。
  • 当动态添加点X时,只需在BST中搜索其两个邻居L和R(两侧各一个)并像往常一样插入。如果X - L<阈值,然后X加入L的集群;如果R - X<阈值,然后X加入R的集群;如果两者都是真的,则必须组合L的集群和R集群;如果没有,则X形成自己的新集群。
  • 当动态移除点X时,如前所述找到其邻居L和R,并且如果它们当前属于相同的簇C,则检查是否R-L>阈。如果是,请从X向左(或向右)扫描,将每个点放入新的群集,直到找到不在C中的点。
  • 移动相当于删除后插入。

您可以在每个BST节点内的字段中记录每个点所属的群集。或者,如果插入占主导地位,那么使用union/find data structure可能会更快。

答案 1 :(得分:0)

除了BST(或决策树)之外的其他方法是像BIRCH algorithm这样的层次聚类,它非常适合大型数据集并将新数据点添加到现有集群中,而且它的性能也是最好的之一