问题在于:
数字是整数,时间段是一年。
什么算法会识别数字中的模式?
模式可能很简单,例如总是上升或总是下降,或者数字可能在一个狭窄的范围内,等等。
我有一些想法,但我不确定最佳方法,或已存在的解决方案:
答案 0 :(得分:5)
对数据进行分组。
如果您不知道数据有多少模式,请使用高斯混合模型(GMM)和评分函数(例如,贝叶斯信息准则(BIC)),以便您可以自动检测可能的数字您的数据中的群集。如果您不知道k
可能是什么值,我建议使用此代替k-means。一旦为过去一年的数据构建了GMM,给定一个新的数据点x
,您就可以计算出任何一个聚类(由GMM中的高斯模型建模)生成它的概率。如果您的新数据点由任何一个群集生成的概率很低,则很可能是一个真正的异常值。
如果这听起来有点过分,您会很高兴地知道,在优秀的 MCLUST包中已经为您实现了自动群集识别的整个GMM + BIC程序的 - [R 即可。我已多次使用它来取得这些问题的巨大成功。
它不仅可以识别异常值,而且如果您在某个时刻需要此功能(或想要它),您还可以将p值设置为异常值。
答案 1 :(得分:3)
您可以使用linear regression尝试线条拟合预测,看看它是如何进行的,用您选择的语言实现起来相当容易。 在为数据拟合线后,您可以计算沿线的平均值standard deviation。 如果新颖点在trend line + - 标准偏差上,则不应视为异常。
PCA是处理此类数据时想到的另一种技术。
你也可以查看unsuperviced learning。这是一种机器学习技术,可用于检测较大数据集中的差异。
听起来像个有趣的问题!祝你好运
答案 2 :(得分:3)
你提到的所有技巧都没有什么神奇之处。我相信你应该首先尝试缩小你可能遇到的典型异常,这有助于保持简单。
然后,您可能想要计算与这些要素相关的派生数量。例如:“我想检测突然改变方向的数字”=>计算u_ {n + 1} - u_n,并期望它具有常数符号,或者在某个范围内下降。您可能希望保持这种灵活性,并允许您的代码设计具有可扩展性(如果您执行OOP,策略模式可能值得关注)
然后,当您有一些感兴趣的派生数量时,您会对它们进行统计分析。例如,对于派生数量A,您假设它应该具有一些分布P(a,b)(统一([a,b])或Beta(a,b),可能更复杂),您提出先验法则在a,b上,你根据连续的信息调整它们。然后,添加的最后一个点提供的信息的后验可能性应该给你一些关于它是否正常的见解。每一步的后验和先前法则之间的相对熵也是一个好的事情。有关详细信息,请参阅有关贝叶斯方法的书籍。
如果您想检测异常值,我认为复杂的传统机器学习内容(感知层或SVM仅引用它们)没有什么意义。这些方法在对已知合理清洁的数据进行分类时效果很好。