我正在尝试提出一种回归测试数字序列的方法。
我的测试系统会为每个系统版本(例如高度,宽度,深度等)生成大量数字。这些数字因版本不同而有所不同。给定一系列“好”版本和一个“新”版本,我想找到最不正常的序列。
示例:
“好”版本:
version width height depth
1 123 43 302
2 122 44 304
3 120 46 300
4 124 45 301
“新”版本:
5 121 60 305
在这种情况下,我显然希望找到高度序列,因为值60比宽度或深度更突出。
我目前的方法计算好案例的每个序列的均值和标准差,并且对于新版本的数字,它计算该数字是该序列的一部分的概率(基于已知的均值和标准偏差)。这有点......有点。
我的序列中的数字不一定是高斯分布在平均值附近,但通常是相当恒定的,只有有时产生一个异常值,这似乎也是相当恒定的,例如。 G。 10,10,10,10,10,5,10,10,10,5,10,10,10。在这种情况下,仅基于平均值和标准差,值10不会100%可能在顺序,值5是不太可能的。
我考虑使用直方图方法,并在那里先犹豫不决。直方图的问题在于我需要为每个序列存储大量信息(与平均值和标准差相反)。
我想到的下一个方面是,我非常确定这种任务不是新的,并且可能已经有很好的解决方案可以很好地适应我的情况;但我的研究结果并不多。
我发现像PyBrain这样的库,乍一看似乎处理数字序列,然后显然试图用模拟神经网络分析这些。我不确定这对我来说是不是一种方法(而且似乎我必须为每个数字序列存储大量数据,如完整的神经网络)。
所以我的问题是:
是否有技术,算法或科学学科可以帮助我分析数字序列以找出异常(在最后一个值中)?优选地,每个序列仅存储少量数据; - )
对于具体实现,我更喜欢Python,但也欢迎其他语言的提示。
答案 0 :(得分:1)
那里有技术,算法或科学学科吗? 这将有助于我分析数字序列,以发现异常(在 最后一个值)?
您正在寻找的科学发现被称为异常检测/异常检测。您可以使用许多技术和算法。作为起点,可以查看维基百科here (outlier detection)和here (Anomaly detection)。 stats.stackexchange.com上有一个类似的问题,datascience.stackexchange.com上有一个关注python的问题。
您还应该考虑在您的情况下更糟糕的情况,误报(类型1错误)或漏报(类型2错误),因为降低其中一种错误类型的百分比会增加另一种错误类型的百分比。
编辑:鉴于您的要求在某些情况下有多个峰值,在其他情况下平坦分布,这样的算法可能有效:
1。)计算序列中每个单个数字的出现次数,并将计数放在与该数字对应的bin中(初始bin宽度= 1)
2。)迭代垃圾箱:如果一个垃圾箱计数超过例如序列中值总数的10%(参数a),将该数字标记为"良好值"
3.)将bin宽度增加1并重复步骤1和2
4。)重复步骤1-3,直到例如序列中数字的90%(参数b)标记为"良好的值"
5.)让错误值的测试用例失败
此算法适用于以下情况:
带有一些异常值的单个大峰值
多个大峰和一些异常值
浓度在某个区域(或多个区域)的扁平分布
所有数字相等的数字序列
参数a和b必须根据您的需要进行调整,但我认为这不应该很难。
注意 :要检查值属于哪个bin,您可以使用模运算符(%),例如如果bin大小为3,并且您具有值475,476,477,478,479,则根据其模块的bin大小为零的值命名bin - > 477%3 = 0 - >将477,478和479放入bin 477。
答案 1 :(得分:1)
您可以使用称为高斯过程(GP)的回归技术来学习曲线,然后将高斯过程应用于序列中的下一个示例。
由于全科医生不仅可以为您提供对目标的估计,还可以根据您的信心确定什么是异常值,从而为您提供信心。
要意识到存在各种工具箱(scikits.learn,shogun,...),但最容易的是GPy。在下面的笔记本中可以很好地描述一个可以调整以完成任务的1d回归示例:
http://nbviewer.jupyter.org/github/SheffieldML/notebook/blob/master/GPy/basic_gp.ipynb
答案 2 :(得分:0)
我想知道您的数据中的不同列是否可以用不同的方式处理?是否适合,例如用"接近平均值来处理宽度"校验;在一组优秀的例子中看到的另一列"值&#34 ;;第三列可能由"在现有的集群中从K-means聚类好的例子"。
您可以为每个列评分,并标记任何一个或多个不符合要求的列的新值,并说明为什么。
嗯,它并不局限于单个列 - 例如,如果列值之间存在某种关系,那么也可以检查 - 也许宽度乘以高度是有限的;或者音量有限制。
时间:可能连续的值只能以某种给定的方式偏离某个值 - 例如,如果某些机器人连续改变边并且测量之间的时间足够短,则会限制delta值在连续读数之间,机器人机构在正常工作时可以产生的读数。
我想这个答案的很大一部分是使用您对数据源的任何知识来提供帮助。
答案 3 :(得分:0)
我不确定我是否理解正确,但我认为您想要预测呈现给您的样本(在经历一系列先前的示例之后)是否异常?因此,您是否暗示了新样本的某种时间依赖性?
如果你有很多训练数据我。即(数百或数千)(标记的)好的和坏的序列的例子,那么你可能能够训练神经结构来分类“序列中的下一个元素”是否异常。您可以训练LSTM(长短期记忆)架构,该架构将对输入序列进行推广,以准确分类呈现给架构的新样本。
LSTM将可用于任何良好的神经网络库,基本上您将运行一般的监督学习例程。有关这方面的教程遍及互联网和任何良好的机器学习(ML)书籍。
与ML一样,注意不要过度贴合!