我正在尝试开发一种方法来对数列进行回归测试。
我的测试系统会为每个系统版本生成大量的数字(例如高度、宽度、深度等)。这些数字在不同版本之间以未知的方式变化。给定一系列“良好”版本和一个“新”版本,我希望找出那些最异常的序列。
示例:
“良好”版本:
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比宽度或深度更为显眼。
我目前的方法是计算每个良好案例序列的平均值和标准差,对于新版本的数字,计算这个数字属于该序列的概率(基于已知的平均值和标准差)。这种方法…效果一般。
我的序列中的数字不一定是围绕平均值的正态分布,而是常常相当恒定,且仅在某些情况下产生异常值,这些异常值看起来也相当恒定,例如10, 10, 10, 10, 10, 5, 10, 10, 10, 5, 10, 10, 10。在这种情况下,仅基于平均值和标准差,数值10不会100%可能属于该序列,而数值5则相当不可能。
我考虑过使用直方图方法,但犹豫不决,先在这里询问。使用直方图的问题在于我需要为每个序列存储大量信息(相较于仅存储平均值和标准差)。
我接下来考虑的方面是,我确信这类任务并非新鲜事,可能已经有适合我情况的解决方案;但在我的研究中并未找到太多相关内容。
我发现了一个名为PyBrain的库,乍一看它似乎能处理数列,然后显然尝试通过模拟神经网络进行分析。我不确定这是否适合我(而且似乎我需要为每个数列存储大量数据,如完整的神经网络)。
所以我的问题是:
是否存在一种技术、算法或科学学科可以帮助我分析数列以发现异常(在最后一个值中)?最好是每序列只存储少量数据 😉
对于具体实现,我更倾向于使用Python,但也欢迎其他语言的建议。
回答:
你可以使用一种称为高斯过程(GP)的回归技术来学习曲线,然后将高斯过程应用于序列中的下一个示例。
由于GP不仅能为目标提供一个估计值,还能提供一个置信度,你可以基于置信度设定阈值来确定什么是异常值。
要实现这一点,存在各种工具箱(scikits.learn, shogun,…),但最简单的可能是GPy。一个1维回归的示例,你可以调整以完成你的任务,在以下笔记本中有很好的描述:
http://nbviewer.jupyter.org/github/SheffieldML/notebook/blob/master/GPy/basic_gp.ipynb