从数据库中确定不同的一维数据集群

机器算法验证 聚类 k-均值
2022-02-09 19:20:40

我有一个不同节点之间数据传输的数据库表。这是一个巨大的数据库(有近 4000 万次转账)。属性之一是传输的字节数 (nbytes),范围从 0 字节到 2 太字节。我想对 nbytes 进行聚类,使得给定 k 个集群,一些 x1 传输属于 k1 集群,x2 传输到 k2 等。

从我使用的术语中,您可能已经猜到了我的意思:K-means。这是一维数据,因为 nbytes 是我唯一关心的特性。当我在寻找不同的方法时,我看到 EM 与非聚类方法一起被提到了几次。我想知道你对如何解决这个问题的看法(特别是集群还是不集群)。

谢谢!

4个回答

在一维数据中,不要使用聚类分析。

聚类分析通常是一种多变量技术。或者让我更好地换个说法:对于完全有序的一维数据,有更好的技术。在这里使用 k-means 和类似技术完全是浪费,除非您付出足够的努力来实际优化它们以用于 1-d 情况。

举个例子:对于 k-means,通常使用 k 个随机对象作为初始种子。对于一维数据,只需使用适当的分位数(1/2k、3/2k、5/2k 等),对数据进行一次排序后,然后从这个起点进行优化,就很容易做得更好。但是,二维数据不能完全排序。在网格中,可能会有空单元格。

我也不会称它为集群。我称之为区间你真正想做的是优化区间边界。如果您使用 k-means,它将测试每个对象是否应该移动到另一个集群。这在 1D 中没有意义:只需要检查间隔边界处的对象。这显然要快得多,因为那里只有大约 2k 个对象。如果他们不喜欢其他间隔,更多的中心对象也不会。

例如,您可能想研究诸如Jenks Natural Breaks optimization之类的技术。

或者您可以进行核密度估计并寻找密度的局部最小值以在那里分割。好消息是您不需要为此指定 k !

有关如何在 Python 中执行此操作的示例,请参见此答案(绿色标记是集群模式;红色标记是数据被切割的点;y 轴是密度的对数似然):

KDE 与 Python

PS请使用搜索功能。以下是您错过的有关一维数据聚类的一些问题:

一维聚类可以优化和有效地完成,这可以让您深入了解数据的结构。

在一维的情况下,有一些方法是最优和有效的(O(kn)),作为奖励,甚至还有正则化的聚类算法,可以让你自动选择聚类的数量!我推荐这个调查:https ://cs.au.dk/~larsen/papers/1dkmeans.pdf 可以在 Ckmeans.1d.dp 包中找到 R 实现 : https ://cran.r-project.org/web /packages/Ckmeans.1d.dp/index.html

作为旁注,一维聚类可用于量化,您可以使用一组较小的值来表示输入数据;例如,这可以帮助压缩或加快搜索速度。

你的问题是你应该集群还是应该使用什么方法来集群?

关于是否应该集群,这取决于您是否要自动对数据进行分区(例如,如果您想多次重复此分区)。如果您只这样做一次,您可以只查看值分布的直方图,并按照评论中的建议对其进行划分。无论如何,我建议您通过肉眼查看数据,因为它可以帮助您确定需要多少集群以及集群是否“有效”。

关于聚类的类型,如果数据中有“真实”聚类,k-means 应该没问题。如果您在直方图中看不到任何集群,那么无论如何对它进行集群都没有多大意义,因为您的数据范围的任何分区都会给出有效的集群(或者在随机启动 kmeans 的情况下,您将获得不同的集群每次运行)。

你可以试试:

  1. KMeans、GMM 或其他方法通过指定 n_clusters=no。核密度图中的峰值。

  2. KMeans、GMM 或其他方法通过确定最佳编号。基于一些指标的集群。更多信息:[这里] https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set