13

背景

这是问题所在:

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

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

问题

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

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

想法

我有一些想法,但不确定最佳方法或已经存在哪些解决方案:

  • 机器学习算法?
  • 神经网络?
  • 对正常数和异常数进行分类?
  • 统计分析?
4

3 回答 3

5

集群您的数据

如果您不知道您的数据有多少种模式,请使用高斯混合模型 (GMM) 和评分函数(例如,贝叶斯信息准则 (BIC)),这样您就可以自动检测可能的集群数量你的数据。如果您不知道k可能是什么值,我建议使用此方法而不是 k-means。一旦您为过去一年的数据构建了 GMM,给定一个新的数据点x,您可以计算它由任何一个集群生成的概率(由 GMM 中的高斯建模)。如果您的任何一个集群生成新数据点的可能性很小,那么它很可能是一个真正的异常值。

如果这听起来有点过于复杂,您会很高兴知道用于自动集群识别的整个 GMM + BIC 程序已经在R的优秀 MCLUST包中为您实现。我已经多次使用它来解决此类问题。

它不仅可以让您识别异常值,而且如果您在某些时候需要此功能(或想要它),您还可以将 p 值放在一个异常值上。

于 2010-09-29T01:27:39.847 回答
3

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

然后,您可能想要计算与这些特征相关的派生量。例如:“我想检测突然改变方向的数字”=> 计算 u_{n+1} - u_n,并期望它具有恒定符号,或者落在某个范围内。您可能希望保持这种灵活性,并允许您的代码设计可扩展(如果您使用 OOP,策略模式可能值得一看)

然后,当您有一些感兴趣的衍生数量时,您对它们进行统计分析。例如,对于派生量 A,您假设它应该具有某种分布 P(a, b)(uniform([a, b]) 或 Beta(a, b),可能更复杂),您将先验定律在 a、b 上,您根据连续信息调整它们。然后,添加的最后一点提供的信息的后验可能性应该让您了解它是否正常。每一步的后验定律和先验定律之间的相对熵也是值得监控的。有关更多信息,请参阅有关贝叶斯方法的书。

如果您想检测异常值,我认为复杂的传统机器学习内容(感知器层或 SVM 仅引用它们)没什么意义。这些方法在对已知相当干净的数据进行分类时效果很好。

于 2010-09-23T09:27:04.173 回答
3

You could try line fitting prediction using linear regression and see how it goes, it would be fairly easy to implement in your language of choice. After you fitted a line to your data, you could calculate the mean standard deviation along the line. If the novel point is on the trend line +- the standard deviation, it should not be regarded as an abnormality.

PCA is an other technique that comes to mind, when dealing with this type of data.

You could also look in to unsuperviced learning. This is a machine learning technique that can be used to detect differences in larger data sets.

Sounds like a fun problem! Good luck

于 2010-09-23T08:51:39.727 回答