剩下的继续补充~
概述
“异常”通常是⼀个主观的判断,什么样的数据被认为是“异常”的,需要结合业务背景和环境来具体分
析确定。
实际上,数据通常嵌⼊在⼤量的噪声中,而我们所说的“异常值”通常指具有特定业务意义的那⼀类
特殊的异常值。噪声可以视作特性较弱的异常值,没有被分析的价值。噪声和异常之间、正常数据和噪声之间的边界都是模糊的。异常值通常具有更⾼的离群程度分数值,同时也更具有可解释性。
在普通的数据处理中,我们常常需要保留正常数据,而对噪声和异常值的特性则基本忽略。但在异
常检测中,我们弱化了“噪声”和“正常数据”之间的区别,专注于那些具有有价值特性的异常值。在基于相似度的⽅法中,主要思想是异常点的表⽰与正常点不同
基于距离的度量
基于距离的⽅法是⼀种常⻅的适⽤于各种数据域的异常检测算法,它基于最近邻距离来定义异常
值。 此类⽅法不仅适⽤于多维数值数据,在其他许多领域,例如分类数据,⽂本数据,时间序列数据和序列数据等⽅⾯也有⼴泛的应⽤。
基于距离的异常检测有这样⼀个前提假设,即异常点的
k
k
k近邻距离要远⼤于正常点。解决问题的最
简单⽅法是使⽤嵌套循环。 第⼀层循环遍历每个数据,第⼆层循环进⾏异常判断,需要计算当前点与其他点的距离,⼀旦已识别出多于
k
k
k个数据点与当前点的距离在
D
D
D之内,则将该点⾃动标记为⾮异常值。这样计算的时间复杂度为
O
(
N
2
)
O(N^2)
O(N2),当数据量⽐较⼤时,这样计算是及不划算的。 因此,需要修剪⽅法以
加快距离计算。
基于单元的方法
在基于单元格的技术中,数据空间被划分为单元格,单元格的宽度是阈值D和数据维数的函数。具
体地说,每个维度被划分成宽度最多为
D
2
⋅
d
1
2
\frac{D}{2 \cdot d^{\frac {1}{2}}}
2⋅d21D单元格。在给定的单元以及相邻的单元中存在的数据点满⾜
某些特性,这些特性可以让数据被更有效的处理。
以⼆维情况为例,此时⽹格间的距离为
D
2
⋅
d
1
2
\frac{D}{2 \cdot d^{\frac {1}{2}}}
2⋅d21D,需要记住的⼀点是,⽹格单元的数量基于数据空间的分区,并且与数据点的数量⽆关。这是决定该⽅法在低维数据上的效率的重要因素,在这种情况下,⽹格单元的数量可能不多。 另⼀⽅⾯,此⽅法不适⽤于更⾼维度的数据。对于给定的单元格,其
L
1
L_1
L1邻居被定义为通过最多1个单元间的边界可从该单元到达的单元格的集合。请注意,在⼀个⻆上接触的两个单元格也是
L
1
L_1
L1邻居。
L
2
L_2
L2邻居是通过跨越2个或3个边界而获得的那些单元格。 上图中显⽰了标记为
X
X
X的特定单元格及其
L
1
L_1
L1和
L
2
L_2
L2邻居集。 显然,内部单元具有8个
L
1
L_1
L1邻居和40个
L
1
L_1
L1邻居。 然后,可以⽴即观察到以下性质:
- 单元格中两点之间的距离最多为 D 2 \frac {D}{2} 2D
- ⼀个点与 L 1 L_1 L1邻接点之间的距离最⼤为 D D D。
- ⼀个点与它的
L
r
L_r
Lr邻居(其中
r
r
r> 2)中的⼀个点之间的距离⾄少为
D
D
D
唯⼀⽆法直接得出结论的是 L 2 L_2 L2中的单元格。 这表⽰特定单元中数据点的不确定性区域。 对于这些
情况,需要明确执⾏距离计算。 同时,可以定义许多规则,以便⽴即将部分数据点确定为异常值或⾮异常值。 规则如下: - 如果⼀个单元格中包含超过 k k k个数据点及其 L 1 L_1 L1邻居,那么这些数据点都不是异常值。
- 如果单元
A
A
A及其相邻
L
1
L_1
L1和
L
2
L_2
L2中包含少于
k
k
k个数据点,则单元A中的所有点都是异常值。
此过程的第⼀步是将部分数据点直接标记为⾮异常值(如果由于第⼀个规则而导致它们的单元格包
含 k k k个点以上)。 此外,此类单元格的所有相邻单元格仅包含⾮异常值。 为了充分利⽤第⼀条规则的修剪能⼒,确定每个单元格及其 L 1 L_1 L1邻居中点的总和。 如果总数⼤于 k k k,则所有这些点也都标记为⾮离群值。
接下来,利⽤第⼆条规则的修剪能⼒。 对于包含⾄少⼀个数据点的每个单元格 A A A,计算其中的点数
及其 L 1 L_1 L1和 L 2 L_2 L2邻居的总和。 如果该数字不超过 k k k,则将单元格 A A A中的所有点标记为离群值。 此时,许多单元可能被标记为异常值或⾮异常值。
对于此时仍未标记为异常值或⾮异常值的单元格中的数据点需要明确计算其 k k k最近邻距离。即使对
于这样的数据点,通过使⽤单元格结构也可以更快地计算出 k k k个最近邻的距离。考虑到⽬前为⽌尚未被标记为异常值或⾮异常值的单元格 A A A。这样的单元可能同时包含异常值和⾮异常值。单元格 A A A中数据点的不确定性主要存在于该单元格的 L 2 L_2 L2邻居中的点集。⽆法通过规则知道 A A A的 L 2 L_2 L2邻居中的点是否在阈值距离 D D D内,为了确定单元 A A A中数据点与其 L 2 L_2 L2邻居中的点集在阈值距离 D D D内的点数,需要进⾏显式距离计算。对于那些在 L 1 L_1 L1和 L 2 L_2 L2中不超过 k k k个且距离小 D D D 的数据点,则声明为异常值。需要注意,仅需要对单元 A A A中的点到单元的邻居中的点执⾏显式距离计算。这是因为已知 L 1 L_1 L1邻居中的所有点到 A A A中任何点的距离都小于 D D D,并且已知 L r L_r Lr中 ( r > 2 ) (r>2) (r>2)的所有点与 A A A上任何点的距离⾄少为 D D D。因此,可以在距离计算中实现额外的节省。
基于索引的方法
对于⼀个给定数据集,基于索引的⽅法利⽤多维索引结构(如
R
R
R树、
k
−
d
k-d
k−d树)来搜索每个数据对象
在半径
A
A
A范围
D
D
D内的相邻点。设
M
M
M是⼀个异常值在其
D
D
D-邻域内允许含有对象的最多个数,若发现某个数据对象
A
A
A
D
D
D -邻域内出现
M
+
1
M+1
M+1甚⾄更多个相邻点,则判定对象
A
A
A不是异常值。该算法时间复杂度在最坏情况下为
O
(
k
N
2
)
O(kN^2)
O(kN2),其中
k
k
k是数据集维数,
N
N
N是数据集包含对象的个数。该算法在数据集的维数增加时具有较好的扩展性,但是时间复杂度的估算仅考虑了搜索时间,而构造索引的任务本⾝就需要密集复杂的计算量。
基于密度的度量
基于密度的算法主要有局部离群因⼦(LocalOutlierFactor,LOF),以及LOCI、CLOF等基于LOF的改进算法。下⾯我们以LOF为例来进⾏详细的介绍和实践。
基于距离的检测适⽤于各个集群的密度较为均匀的情况。在下图中,离群点B容易被检出,而若要
检测出较为接近集群的离群点A,则可能会将⼀些集群边缘的点当作离群点丢弃。而LOF等基于密度的算法则可以较好地适应密度不同的集群情况。
那么,这个基于密度的度量值是怎么得来的呢?还是要从距离的计算开始。类似k近邻的思路,⾸先我们也需要来定义⼀个“k-距离”。
k-距离(k-distance§)
对于数据集D中的某⼀个对象o,与其距离最近的k个相邻点的最远距离表⽰为k-distance§,定义为给定点p和数据集D中对象o之间的距离d(p,o),满⾜:
直观⼀些理解,就是以对象o为中⼼,对数据集D中的所有点到o的距离进⾏排序,距离对象o第k近的点p与o之间的距离就是k-距离。