【问题标题】:Algorithm to find clusters in 1d clusters, but not necessarily clusterise everything在 1d 集群中查找集群的算法,但不一定将所有内容都集群化
【发布时间】: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


【解决方案1】:

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

然后定义一个密度阈值。低于阈值的点将被移除,并将数据分成簇。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 2022-11-30
      • 1970-01-01
      • 2016-02-24
      • 2011-11-28
      • 2013-08-20
      • 2016-03-03
      • 1970-01-01
      • 2011-11-11
      相关资源
      最近更新 更多