我有一组来自单位间隔的数据点(即带有数值的1维数据集)。我在线收到一些额外的数据点,而且一些数据点的值可能会动态变化。我正在寻找一种理想的聚类算法,可以有效地处理这些问题。
我知道sequential k-means clustering应对新实例的添加,我想稍微修改它可以处理动态实例值(即首先从相应的集群中获取修改后的实例,然后更新集群的均值最后将修改后的实例作为算法的输入,就像添加一个看不见的实例一样。)
我对使用k-means算法的关注是要求提供簇数作为输入。我知道他们在时间和空间复杂性方面击败了其他聚类算法(GA,MST,分层方法等)。老实说,我不确定,但也许我可以使用上述算法之一逃脱。即使我的数据集相对较大,单个维度的存在也让我感到奇怪。
更具体地说,我的典型测试案例将包含大约10K-200K的1维数据点。我想在一秒钟之内完成聚类。假设值点的动态变化是平滑的,即相对较小。因此,非常优选能够使用现有解决方案(即,当改变值或添加新值时能够继续对现有解决方案进行聚类)。
总而言之:你能想到一种能够在计算效率和集群精度之间提供最佳点的算法。上面定义的问题?
k-means算法是否有一些很好的启发式方法可以预先自动计算K的值?
答案 0 :(得分:1)
由于您的数据集是一维的,因此您可以使用一种非常简单有效的方法根据single-linkage clustering规则动态更新群集。该规则规定,只要第一个聚类中的某个点和第二个聚类中的某个点低于某个预先指定的阈值距离,就会将2个聚类连接成1。
您可以在每个BST节点内的字段中记录每个点所属的群集。或者,如果插入占主导地位,那么使用union/find data structure可能会更快。
答案 1 :(得分:0)
除了BST(或决策树)之外的其他方法是像BIRCH algorithm这样的层次聚类,它非常适合大型数据集并将新数据点添加到现有集群中,而且它的性能也是最好的之一