【发布时间】:2018-12-30 01:57:46
【问题描述】:
假设我有一个如下所示的数组:
[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* 中其他项目之间距离的平均值clusters 将其归类为异常。然而,这不是很准确,并且仍然存在人为偏见的因素(为什么是 2*,而不是 3*?);此外,它在开始和结束或数组中完全失控。因此,如果你们中的任何人推荐一种可以更好地工作的快速算法,或者上述方法的实现,我们将不胜感激。
提前致谢。
【问题讨论】:
-
你看过 scikit 吗?
-
请向我们展示您到目前为止所做的尝试
-
请问这个数组是从哪里来的?我只是好奇,但也许知道对您有所帮助?
-
@Valentino 这些是示例编号,但在实际系统中,我会比较 HTML 代码的属性以对它们进行分类。我使用 Tensorflow 进行文本分类,但有些东西(例如 CSS 长度、CSS:HTML 比率)是数字。虽然其中有一些模式,但并不明显或在一个地方 - 例如,A 类可能有很多非常高的值和低值,但两者之间几乎没有。
标签: python cluster-analysis anomaly-detection