一种基于PCA的时间序列异常检测方法
郭小芳1, 李 锋2, 宋晓宁1
【摘 要】摘要: 在k-近邻局部异常检测算法的基础上, 采用基于主成分分析的多元时间序列的降维方法, 依据累积贡献率选择主成分序列, 给出了一种效率较高的多元时间序列异常检测算法. 实验结果表明: 该算法可以较好地提高多元时间序列异常检测的效率.
【期刊名称】江西师范大学学报(自然科学版) 【年(卷),期】2012(036)003 【总页数】4
【关键词】关键词: 多元时间序列; 主成分分析; k-近邻; 异常检测
0 引言
异常检测(outlier detection)也称为异常挖掘、孤立点分析, 其目标是在数据集中发现不正常的数据点[1]. 目前异常检测方法有基于距离的异常点检测方法、基于密度的异常检测方法、基于模型的异常检测方法[2]. 在现有的检测方法中, 基于距离的异常点检测方法效率较高, 但对数据分布不同的数据集效果较差; 基于异常密度的方法虽然检测精度好,但复杂度较高, 响应速度较慢; 基于模型的方法具有理论上的严密性, 但对于数据分布的识别和模型参数的估计存在一定的困难[3].
多元时间序列同时具有数据量大、维度高、变量相关性高、大量噪声干扰等特点, 使异常检测更加困难[4]. 本文在k-近邻局部异常检测算法的基础上,结合基于主成分分析的多元时间序列的降维方法,按照累积贡献率选择主成分序列, 利用局部异常检测方法对多元时间序列进行异常检测. 最后以股票数据异常检测实
验验证了算法的有效性和合理性.
1 相关概念
在统计学中, 异常是指那些不服从序列分布、与其他数据点距离较远的数据点; 在回归模型中,异常是指与给定模型偏离很大的数据点. 时间序列中的异常点通常是指在偏离数据集中大部分数据的数据, 这些偏离数据可能是由完全不同的机制产生的, 而非随机偏差[5].
按照异常的表现形式不同, 时间序列的异常可以分为序列异常、点异常及模式异常3种情况: (1)序列异常, 在时间序列数据集中与其它时间序列显著不同的、来源于不同产生机制的时间序列; (2)点异常, 在一条时间序列上与其它序列点存在显著差异的、具有异常特征的序列点; (3)模式异常, 在一条时间序列上与其它模式存在显著差异的、具有异常行为的模式.
其中, 二元组(li, ki)中的 li , k i( i = 1 , 2)分别表示模式的长度和斜率, 即模式变化的长短和变化趋势.
2 多元时间序列异常检测算法
多元时间序列异常检测流程图如图1所示, 即首先利用主成分分析对多元时间序列进行降维处理,得到多元时间序列的主成分序列, 在此基础上找出每个MTS的k-近邻序列, 计算各 MTS序列的异常因子 ()LOF q, 并对异常因子进行排序, 输出λ最异常的MTS序列. 2.1 PCA主成分分析
主成分分析技术PCA可以有效地找出数据中最“主要”的元素和结构, 对原有数据进行简化, 并揭示隐藏在复杂数据背后的简单关系[6], 其基本思想是对原始变量的适当线性组合, 形成少数几个原始变量主要信息的新变量, 并采用新变量
来分析问题和解决问题, 其原理如图2所示. 原始变量X1和X2相关性很强(点分布在倾斜的椭圆内), 在适当的坐标变换下(如逆时针旋转一个角度θ), 则新旧坐标之间关系
从图2可以看出n个点的波动主要在1Z方向, Z2方向上的波动可以忽略, 这样可以将2维问题降为1维处理, 达到降维的目的[7-8].
对于代表MTS项的2个矩阵A和B(要求列数相同), 首先先通过奇异值分解获得每个矩阵的主成分,然后试探性选择最初的z个主成分(如选取代表变化95%的前z个主成分), 其相似性矩阵为[12]
其中L和M包含矩阵A和B的前z个主成分, ijθ为A的第i个主成分与B的第j个主成分之间的夹角.SPCA从0到z变化, 通过计算2个矩阵的前z个主成分的所有组合的余弦平方值来测量其相似性[9-10]. 2.2 k-近邻局部异常检测
(1)对于给定一个正整数k和一个数据点集合D, 在D中 p 点的k近邻距离 k - d ist( p)满足: (i)称是p的 k th 距离. 在图3中当 k = 3 时,其中 d ( p, o)表示p点到o点的距离.
(2) 若q点到p点的k-近邻距离满足 (3) 点q的k局部可达密度为
其中 K ( q)表示在数据集D中与对象q的距离不超过的所有点的集合. l r d( q)反映了q点周围点分布密度. 如果 l rd ( q)较小, 说明q点成为局部异常点的可能性比较大.
(4)q点的局部异常系数为
LOF( q)的大小值反映q点在其k领域内所含点稀疏程度, L OF( q)值越大, 该点
一种基于 PCA 的时间序列异常检测方法
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)