任意数序列的回归测试

Regression Tests on Arbitrary Number Sequences

我正在尝试想出一种回归测试数字序列的方法。

我的测试系统为每个系统版本生成大量数字(例如高度、宽度、深度等)。这些数字以未知的方式因版本而异。给定一系列 "good" 版本和一个 "new" 版本我想找到最不正常的序列。

示例:

"Good"版本:

version    width   height   depth
   1        123      43      302 
   2        122      44      304
   3        120      46      300
   4        124      45      301

"New"版本:

   5        121      60      305

在这种情况下,我显然想找到高度序列,因为值 60 比宽度或深度更突出。

我目前的方法是计算好案例的每个序列的均值和标准差,对于新版本的数字,它计算这个数字是这个序列的一部分的概率(基于已知的均值和标准差) .这有效……有点。

我的序列中的数字不一定围绕平均值呈高斯分布,但通常相当恒定,只有 有时 产生异常值,该值似乎也相当恒定,e . G。 10, 10, 10, 10, 10, 5, 10, 10, 10, 5, 10, 10, 10。在这种情况下,仅基于均值和标准差,值 10 不会 100% 出现在序列,并且值 5 不太可能。

我考虑过使用直方图方法,犹豫着先在这里问一下。直方图的问题是我需要为每个序列存储相当多的信息(而不是仅仅存储均值和标准差)。

我想到的下一个方面是,我很确定这种任务并不新鲜,而且可能已经有适合我情况的解决方案;但我在研究中发现的不多。

我发现了一个像 PyBrain 这样的库,乍一看它似乎处理数字序列,然后显然试图用模拟神经网络来分析它们。我不确定这是否适合我(而且似乎我必须为每个数字序列存储大量数据,就像一个完整的神经网络)。

所以我的问题是:

是否有一种技术、算法或科学学科可以帮助我分析数字序列以发现异常(在最后一个值中)?最好在每个序列只存储少量数据时 ;-)

对于具体的实现,我更喜欢 Python,但也欢迎提供其他语言的提示。

我想知道是否可以用不同的方式处理数据中的不同列?例如,用 "close to the mean" 检查处理宽度是否合适?另一列 "value seen in set of good examples";第三列可能由 "In existing cluster from K-means clustering of good examples".

处理

您可以为每一列评分并标记任何一个或多个列不适合的新值并说明 为什么.

嗯,它不限于单个列 - 例如,如果列值之间存在某种关系,那么也可以检查 - 也许宽度乘以高度是有限的;或者音量有限制。

时间:可能连续的值只能以某种给定的方式偏离某个值——例如,如果某些机器人连续改变侧面并且测量之间的时间足够短,那么这将限制连续读数与机器人机制正常工作时可能产生的读数之间的增量值。

我想这个答案的很大一部分是利用您对数据源的任何了解来提供帮助。

Is there a technique, an algorithm, or a science discipline out there which would help me analyse number sequences to find abnormalities (in a last value)?

您正在寻找的科学学科称为异常值检测/异常检测。您可以使用许多技术和算法。作为起点,也许可以看看专注于 python.

的维基百科 here (outlier detection) and here (Anomaly detection). There is also a similar question on stats.stackexchange.com and one on datascience.stackexchange.com

您还应该考虑在您的情况下更糟糕的情况,误报(类型 1 错误)或漏报(类型 2 错误),因为减少其中一种错误类型的百分比会增加另一种错误类型的百分比。

编辑:鉴于您的要求在某些情况下有多个峰值,在其他情况下为平坦分布,这样的算法可以工作:

1.) 计算序列中每个数字出现的次数,并将计数放入与该数字对应的容器中(初始容器宽度 = 1)

2.) 遍历箱子:如果单个箱子比例如序列中值总数的 10%(参数 a),将该 bin 的数字标记为 "good values"

3.) 将 bin 宽度增加 1 并重复步骤 1 和 2

4.) 重复步骤 1-3 直到序列中 90%(参数 b)的数字标记为 "good values"

5.) 让错误值的测试用例失败

此算法适用于以下情况:

  • 具有一些异常值的单个大峰

  • 多个大峰和中间的一些异常值

  • 集中在某个区域(或多个区域)的平面分布

  • 所有数字都相等的数列

参数 a 和 b 必须根据您的需要进行调整,但我认为这应该不难。

注意:要检查一个值属于哪个bin,可以使用模运算符(%),例如如果 bin 大小为 3,并且您的值为 475,476,477,478,479,则根据其与 bin 大小的模数为零的值命名 bin -> 477%3=0 -> 将 477、478 和 479 放入 bin 477。

您可以使用称为高斯过程 (GP) 的回归技术来学习曲线,然后将高斯过程应用于序列中的下一个示例。

由于 GP 不仅会为您提供目标的估计值,还会提供置信度,您可以根据置信度确定异常值的阈值。

要实现这一点,存在各种工具箱(scikits.learn、shogun 等),但最简单的可能是 GPy。下面的笔记本很好地描述了一个一维回归的例子,你可以调整它来让你的任务继续进行:

http://nbviewer.jupyter.org/github/SheffieldML/notebook/blob/master/GPy/basic_gp.ipynb

我不确定我是否理解正确,但我想你想预测呈现给你的样本(在经历了一系列之前的例子之后)是否异常?因此,您是在暗示新样本具有某种时间依赖性?

如果你有很多训练数据我。 e. (成百上千个)(标记的)好序列和坏序列的例子,然后你可以训练一个神经结构来分类 'next element in the sequence' 是否异常。您可以训练 LSTM(长短期记忆)架构,该架构将泛化输入序列以准确分类呈现给架构的新样本。

LSTM 将在任何好的神经网络库中可用,基本上您将 运行 一个通用的监督学习例程。关于此的教程遍布 Internet 和任何优秀的机器学习 (ML) 书籍。

与 ML 一样,注意不要过度拟合!