在 1d 集群中查找集群的算法,但不一定对所有内容进行集群

Algorithm to find clusters in 1d clusters, but not necessarily clusterise everything

假设我有一个如下所示的数组:

[0.1,0.12,0.14,0.45,0.88,0.91,0.94,14.3,15,16]

我想识别其中的模式,这样我就可以将它与另一个数据集进行比较,看它是否匹配。例如,如果我输入 0.89,我希望能够看到它属于 0.88-0.94 集群。但是,如果我输入 0.5,我希望看到它不属于数据集,即使它接近 0.45 - 数据异常。

(上面的数组包含示例编号,但在实际系统中我正在比较 HTML 代码的属性以对它们进行分类。我正在使用 Tensorflow 进行文本分类,但有些东西(例如 CSS length, CSS:HTML ratio) 是数字。虽然其中有模式,但并不明显或在一个地方 - 例如类别 A 可能有很多非常高的值和低值,但几乎 none 介于两者之间。我不能给你真实的数字,因为这些是由输入的代码和 ML 预处理器决定的,但我们可以假设这些数字大约有 10% 的异常,并且几乎总是尝试显示一个或一些组合中间,较低或较高。当'training'时,这些数字取自数据并存储在其中一个数组中(代表三个类别)。然后我想获取我的输入并告诉哪些数组的模式似乎与输入的数字一致。)

现在,假设数组有数百或数千个项目。至少有 10% 是异常,我需要考虑到这一点。我想集群检测不是正确的术语——它主要是消除异常——但我特别卡住的部分是具有不同大小的范围。例如,在上面的示例中,我仍然希望 14.3-16 算作一个 range/cluster,即使相距比 0.1-[=19 更远=].

我对有关该主题的维基百科文章 (https://en.m.wikipedia.org/wiki/Anomaly_detection) 进行了一些挖掘,发现最有可能的实用且简单的方法是 K-最近邻式密度分析。但是,我一直无法找到任何可以轻松为我完成此操作的 Python 插件 - 问题是,这个特定任务有太多变化,基本上不可能准确找到我想要的我在找。我还尝试制作自己的基本算法来将每个项目与其邻居进行比较,看看它更接近哪个(聚类),或者如果它的距离大于 2* 中其他项目之间距离的平均值集群 class 它作为一个异常。然而,这不是很准确,并且仍然存在人为偏见的因素(为什么是 2*,而不是 3*?);此外,它在开始和结束或阵列时完全失控。因此,如果你们中的任何人有一个可以更好地工作的快速算法的建议,或者上述算法的实现,我们将不胜感激。

提前致谢。

异常值检测方法可以分为基于分布或基于距离(尽管这些类别不需要不相交)。

对于基于分布的异常检测,您必须拟合适合您的特定问题集的模型。例如,如果你知道你的数据集是正态分布的(一种常见的方法,你可以使用 QQ-plot 来测试这是否遵循),你可以使用正态分布来获得数据点的概率你的数据集。然后,您将设置一个边界(通常为 ~0.05),如果该点属于数据集的概率小于 0.05,则将该点分类为异常值。

如您所知,K-means 本身并不是一种异常检测算法,即使您要找到一组好的质心(在您的示例中,0.5 可能会简单地与 0.45 归类在同一集群中) ,您仍然需要一个歧视性论点(如前所述,或一个基于局部离群因素的距离)。基于距离的离群值检测的问题是,通常情况下,它无法解释为什么数据表现如此。

目前您没有向我们提供有关问题集的足够信息。你能从你的数据中告诉我们什么?它从何而来?你对此有什么假设吗?或者你能做任何假设吗?你已经尝试了什么?情节看起来如何?等等

无论如何,我建议您研究一下复制器神经网络,因为它们通常被认为是异常值检测的一种非常可靠的方法。此外,由于您有大量数据可供训练,因此基于神经网络的算法比其他方法更具优势。

使用经典统计技术,例如内核密度估计。有众所周知的启发式方法来选择带宽。 KDE 很简单,是一维数据的首选。

然后定义密度阈值。低于阈值的点将被删除,并将数据拆分为聚类。