代码之家  ›  专栏  ›  技术社区  ›  Joseph Garvin

什么是检测异常的好算法?

  •  13
  • Joseph Garvin  · 技术社区  · 15 年前

    背景

    问题是:

    1. 一个黑匣子每天输出一个新的数字。
    2. 这些数字已经记录了一段时间。
    3. 当黑框中的新数字超出在一段时间内建立的数字模式时进行检测。

    数字是整数,时间段是一年。

    问题

    什么算法可以识别数字中的模式?

    模式可能很简单,比如总是上升或总是下降,或者数字可能落在一个很窄的范围内,等等。

    思想

    我有一些想法,但不确定最好的方法,或者什么解决方案已经存在:

    • 机器学习算法?
    • 神经网络?
    • 正常和异常数字的分类?
    • 统计分析?
    3 回复  |  直到 15 年前
        1
  •  5
  •   awesomo    15 年前

    群集数据 是的。

    如果你不知道你的数据有多少模式,可以使用高斯混合模型(gmm)和评分函数(bayesian information criterion,bic)来自动检测数据中可能的集群数量。如果你不知道它的价值 k 很可能是。一旦你为你过去一年的数据构建了一个gmm,给你一个新的数据点 x ,您可以计算它是由任何一个集群(gmm中的高斯模型)生成的概率。如果您的新数据点被任何一个集群生成的概率很低,那么它很可能是一个真正的离群值。

    如果这听起来有点过于复杂,您将很高兴地知道,在 杰出的 MCLUST 包装 是的。我已经用过好几次它来解决这样的问题,取得了巨大的成功。

    它不仅允许您识别异常值,而且如果您在某个点上需要此功能(或需要此功能),您还可以将p值放在异常值点上。

        2
  •  3
  •   Theodor    15 年前

    您可以尝试使用 linear regression 看看进展如何,用您选择的语言实现它会相当容易。 在你将一行数据拟合后,你可以计算出平均值 standard deviation 沿着这条线。 如果小说的主题是 trend line +-标准差,不应视为异常。

    PCA 是处理此类数据时想到的另一种技术。

    你也可以看看 unsuperviced learning 是的。这是一种机器学习技术,可用于检测较大数据集中的差异。

    听起来是个有趣的问题!祝你好运

        3
  •  3
  •   Alexandre C.    15 年前

    你提到的所有技巧都没有什么魔力。我相信你应该首先尝试缩小你可能遇到的典型异常,这有助于保持事情简单。

    然后,您可能需要计算与这些特征相关的导出量。例如:“我想检测突然改变方向的数字”=>计算u{n+1}-u{n,并期望它有常数符号,或者落在某个范围内。您可能希望保持这种灵活性,并允许代码设计是可扩展的(如果您执行OOP,策略模式可能值得考虑)。

    然后,当有一些感兴趣的导出量时,对它们进行统计分析。例如,对于一个导出的量a,你假设它应该有一些分布p(a,b)(均匀的([a,b]),或者beta(a,b),可能更复杂),你把先验定律放在a,b上,然后根据连续的信息调整它们。然后,最后一个点提供的信息的后验可能性应该会让你对它是否正常有一些了解。每一步的后验与先验之间的相对熵也是一个好的监测对象。有关更多信息,请参阅有关贝叶斯方法的书籍。

    如果你想检测异常值,我认为在复杂的传统机器学习(感知器层或支持向量机只引用它们)中没有什么意义。这些方法在对已知相当干净的数据进行分类时非常有效。

    推荐文章