高效的动态聚类

数据挖掘 机器学习 算法 聚类 k-均值 分层数据格式
2021-09-24 15:27:05

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

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

我对使用 k-means 算法的担忧是需要提供集群的数量作为输入。我知道他们在时间和空间复杂度上击败了其他聚类算法(GA、MST、分层方法等)。老实说,我不确定,但也许我可以使用上述算法之一。即使我的数据集比较大,单一维度的存在也让我感到好奇。

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

总而言之:

你能想到一种算法,它可以在计算效率和集群的准确性之间提供一个最佳点。上面定义的问题?

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

2个回答

我认为在您的情况下,层次聚类会更省时(使用单一维度)。根据您的任务,您可以实现如下内容:

具有 N 个数据点 d i及其一维值 x i

  1. 根据 x i对数据点进行排序。
  2. 计算相邻数据点之间的距离(N-1 距离)。必须为每个距离分配一对原始数据点 (d i , d j )。
  3. 按降序对距离进行排序以生成数据点对列表 (d i , d j ),从最近的一对开始。
  4. 从列表的开头(最近的对)开始,迭代地将数据点 (d i , d j ) 合并到集群中。(根据 d i和 d j的当前状态,将它们合并意味着:(a)为两个非集群数据点创建新集群,(b)将数据点添加到现有集群和(c)合并两个集群。)
  5. 如果距离超过某个阈值,请停止联合。
  6. 为未进入集群的数据点创建单例集群。

该算法实现了单链接聚类。它可以很容易地调整以实现平均链接。完整的链接效率会降低,但根据您的数据和任务,更简单的链接可能会产生良好的结果。

我相信对于 200K 数据点,如果您为上述操作使用适当的数据结构,它必须少于第二个。

尝试使用 HDBSCAN,即使它是一种分层方法,它也可能被证明更有效。我在比 200k 长一点的多维数据集上运行它,运行时间不到一分钟。需要注意的是它可能产生的集群数量。如果它们太多,您可能要坚持使用分区方法。