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

时间:2018-12-30 01:57:46

标签: python cluster-analysis anomaly-detection

想象一下,我有一个如下数组:

[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长度,CSS:HTML比率) )是数字,虽然其中有模式,但并不明显,也不是在一个地方-例如,类别A可能有很多非常高的值和很低的值,但介于两者之间几乎没有。我不能给您实数,因为这些是由输入的代码和ML预处理器确定的,但是我们可以假设数字约为10%异常,并且几乎总是尝试显示中,低或上的一种或某种组合。从数据中存储并存储在数组之一(代表三个类别)中。然后,我想接受输入并判断数组中的哪些模式似乎与输入数字对齐。)

现在,想象一下数组的长度为数百或数千。至少有10%是异常情况,我需要对此进行说明。我猜聚类检测不是正确的术语-它主要是消除异常-但是我特别喜欢的部分是具有不同大小的范围。例如,在上面的示例中,我仍然希望14.3-16算作一个范围/集群,即使它们之间的距离远比0.1-0.14

我已经对该主题的Wikipedia文章(https://en.m.wikipedia.org/wiki/Anomaly_detection)进行了一些挖掘,发现最可能的功能和最简单的方法是K近邻风格的密度分析。但是,我找不到能够为我轻松完成此操作的任何Python插件-问题是,此特定任务的变型太多,以至于根本无法找到我想要的东西。我还尝试了自己的基本算法,将每个项目与其相邻项目进行比较,以查看哪个项目更接近(群集),或者如果该距离大于2 *,则表示该项目与其他项目之间的平均距离群集将其归类为异常。但是,这不是很准确,仍然存在人为偏见(为什么2 *,而不是3 *?);此外,它在开始和结束或整个阵列中完全枯了头。因此,如果您对快速算法的建议更为有效,或者对上述方法的实现提出建议,将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:1)

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

然后定义密度阈值。阈值以下的点将被删除,并将数据拆分为群集。

答案 1 :(得分:0)

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

对于基于分布的异常检测,您必须安装适合您特定问题集的模型。例如,如果您要知道数据集是正态分布的(一种常见方法,例如,可以使用QQ绘图来测试其是否遵循),则可以使用正态分布来获取数据点成为概率的一部分您的数据集。然后,您将设置一个边界(通常为〜0.05),如果该点成为数据集的一部分的概率小于0.05,则将该点分类为离群值。

如您所知,即使您要找到一组好的质心(仅在示例中,0.5可能会被归类为0.45),K均值并不是一个异常检测算法,您仍然需要一个歧视性的论点(如前所述或一个距离作为局部异常值)。基于距离的离群值检测的问题在于,通常情况下,它无法解释数据为何以这种方式运行。

当前,您没有为我们提供有关您的问题集的足够信息。您可以从数据中告诉我们什么?它从何而来?您对此有任何假设吗?还是可以提出任何假设?您已经尝试了什么?情节看起来如何?等等

无论如何,我建议您研究复制器神经网络,因为它们通常被认为是异常检测的一种非常有信心的方法。另外,由于您要训练的数据很多,因此与其他方法相比,这使基于NN的算法更具优势。