主要内容包括:

  • 基于距离的度量
  • 基于密度的度量

1、概述

“异常”通常是一个主观的判断,什么样的数据被认为是“异常”的,需要结合业务背景和环境来具体分析确定。 实际上,数据通常嵌入在大量的噪声中,而我们所说的“异常值”通常指具有特定业务意义的那一类特殊的异常值。噪声可以视作特性较弱的异常值,没有被分析的价值。噪声和异常之间、正常数据和噪声之间的边界都是模糊的。异常值通常具有更高的离群程度分数值,同时也更具有可解释性。 在普通的数据处理中,我们常常需要保留正常数据,而对噪声和异常值的特性则基本忽略。但在异常检测中,我们弱化了“噪声”和“正常数据”之间的区别,专注于那些具有有价值特性的异常值。在基于相似度的方法中,主要思想是异常点的表示与正常点不同

2、基于距离的度量

基于距离的方法是一种常见的适用于各种数据域的异常检测算法,它基于最近邻距离来定义异常值。 此类方法不仅适用于多维数值数据,在其他许多领域,例如分类数据,文本数据,时间序列数据和序列数据等方面也有广泛的应用。基于距离的异常检测有这样一个前提假设,即异常点的 四、异常检测---基于相似度的方法 - 图1 近邻距离要远大于正常点。解决问题的最简单方法是使用嵌套循环。 第一层循环遍历每个数据,第二层循环进行异常判断,需要计算当前点与其他点的距离,一旦已识别出多于 四、异常检测---基于相似度的方法 - 图2 个数据点与当前点的距离在 四、异常检测---基于相似度的方法 - 图3 之内,则将该点自动标记为非异常值。 这样计算的时间复杂度为四、异常检测---基于相似度的方法 - 图4,当数据量比较大时,这样计算是及不划算的。 因此,需要修剪方法以加快距离计算。

2.1 基于单元的方法

在基于单元格的技术中,数据空间被划分为单元格,单元格的宽度是阈值D和数据维数的函数。具体地说,每个维度被划分成宽度最多为 四、异常检测---基于相似度的方法 - 图5 单元格。在给定的单元以及相邻的单元中存在的数据点满足某些特性,这些特性可以让数据被更有效的处理。
UWiX5C7kCHx5yX7O9yQm9F1ndg-QgMqS3BAwIWPB40k.original.fullsize.png
以二维情况为例,此时网格间的距离为 四、异常检测---基于相似度的方法 - 图7 ,需要记住的一点是,网格单元的数量基于数据空间的分区,并且与数据点的数量无关。这是决定该方法在低维数据上的效率的重要因素,在这种情况下,网格单元的数量可能不多。 另一方面,此方法不适用于更高维度的数据。对于给定的单元格,其 四、异常检测---基于相似度的方法 - 图8 邻居被定义为通过最多1个单元间的边界可从该单元到达的单元格的集合。请注意,在一个角上接触的两个单元格也是 四、异常检测---基于相似度的方法 - 图9 邻居。 四、异常检测---基于相似度的方法 - 图10 邻居是通过跨越2个或3个边界而获得的那些单元格。 上图中显示了标记为 四、异常检测---基于相似度的方法 - 图11的特定单元格及其 四、异常检测---基于相似度的方法 - 图12四、异常检测---基于相似度的方法 - 图13 邻居集。 显然,内部单元具有8个 四、异常检测---基于相似度的方法 - 图14 邻居和40个 四、异常检测---基于相似度的方法 - 图15 邻居。 然后,可以立即观察到以下性质:

  • 单元格中两点之间的距离最多为 四、异常检测---基于相似度的方法 - 图16
  • 一个点与 四、异常检测---基于相似度的方法 - 图17 邻接点之间的距离最大为 四、异常检测---基于相似度的方法 - 图18
  • 一个点与它的 四、异常检测---基于相似度的方法 - 图19 邻居(其中四、异常检测---基于相似度的方法 - 图20 > 2)中的一个点之间的距离至少为四、异常检测---基于相似度的方法 - 图21

唯一无法直接得出结论的是 四、异常检测---基于相似度的方法 - 图22 中的单元格。 这表示特定单元中数据点的不确定性区域。 对于这些情况,需要明确执行距离计算。 同时,可以定义许多规则,以便立即将部分数据点确定为异常值或非异常值。 规则如下:

  • 如果一个单元格中包含超过 $k$ 个数据点及其 四、异常检测---基于相似度的方法 - 图23 邻居,那么这些数据点都不是异常值。
  • 如果单元 四、异常检测---基于相似度的方法 - 图24 及其相邻 四、异常检测---基于相似度的方法 - 图25四、异常检测---基于相似度的方法 - 图26 中包含少于 四、异常检测---基于相似度的方法 - 图27 个数据点,则单元A中的所有点都是异常值。

此过程的第一步是将部分数据点直接标记为非异常值(如果由于第一个规则而导致它们的单元格包含 四、异常检测---基于相似度的方法 - 图28 个点以上)。 此外,此类单元格的所有相邻单元格仅包含非异常值。 为了充分利用第一条规则的修剪能力,确定每个单元格及其 四、异常检测---基于相似度的方法 - 图29 邻居中点的总和。 如果总数大于 四、异常检测---基于相似度的方法 - 图30 ,则所有这些点也都标记为非离群值。
接下来,利用第二条规则的修剪能力。 对于包含至少一个数据点的每个单元格 四、异常检测---基于相似度的方法 - 图31,计算其中的点数及其 四、异常检测---基于相似度的方法 - 图32四、异常检测---基于相似度的方法 - 图33 邻居的总和。 如果该数字不超过 四、异常检测---基于相似度的方法 - 图34,则将单元格四、异常检测---基于相似度的方法 - 图35 中的所有点标记为离群值。 此时,许多单元可能被标记为异常值或非异常值。
对于此时仍未标记为异常值或非异常值的单元格中的数据点需要明确计算其 四、异常检测---基于相似度的方法 - 图36 最近邻距离。即使对于这样的数据点,通过使用单元格结构也可以更快地计算出 四、异常检测---基于相似度的方法 - 图37 个最近邻的距离。考虑到目前为止尚未被标记为异常值或非异常值的单元格四、异常检测---基于相似度的方法 - 图38。这样的单元可能同时包含异常值和非异常值。单元格 四、异常检测---基于相似度的方法 - 图39 中数据点的不确定性主要存在于该单元格的 四、异常检测---基于相似度的方法 - 图40 邻居中的点集。无法通过规则知道 四、异常检测---基于相似度的方法 - 图41四、异常检测---基于相似度的方法 - 图42 邻居中的点是否在阈值距离 四、异常检测---基于相似度的方法 - 图43 内,为了确定单元 四、异常检测---基于相似度的方法 - 图44 中数据点与其四、异常检测---基于相似度的方法 - 图45 邻居中的点集在阈值距离 四、异常检测---基于相似度的方法 - 图46 内的点数,需要进行显式距离计算。对于那些在 四、异常检测---基于相似度的方法 - 图47四、异常检测---基于相似度的方法 - 图48 中不超过 四、异常检测---基于相似度的方法 - 图49 个且距离小于 四、异常检测---基于相似度的方法 - 图50 的数据点,则声明为异常值。需要注意,仅需要对单元 四、异常检测---基于相似度的方法 - 图51 中的点到单元四、异常检测---基于相似度的方法 - 图52四、异常检测---基于相似度的方法 - 图53邻居中的点执行显式距离计算。这是因为已知 四、异常检测---基于相似度的方法 - 图54 邻居中的所有点到 四、异常检测---基于相似度的方法 - 图55 中任何点的距离都小于 四、异常检测---基于相似度的方法 - 图56,并且已知 四、异常检测---基于相似度的方法 - 图57四、异常检测---基于相似度的方法 - 图58 的所有点与 四、异常检测---基于相似度的方法 - 图59上任何点的距离至少为 四、异常检测---基于相似度的方法 - 图60。因此,可以在距离计算中实现额外的节省。

2.2 基于索引的方法

对于一个给定数据集,基于索引的方法利用多维索引结构(如 四、异常检测---基于相似度的方法 - 图61 树、四、异常检测---基于相似度的方法 - 图62 树)来搜索每个数据对象 四、异常检测---基于相似度的方法 - 图63 在半径 四、异常检测---基于相似度的方法 - 图64 范围 内的相邻点。设 四、异常检测---基于相似度的方法 - 图65 是一个异常值在其 四、异常检测---基于相似度的方法 - 图66 -邻域内允许含有对象的最多个数,若发现某个数据对象 四、异常检测---基于相似度的方法 - 图67四、异常检测---基于相似度的方法 - 图68 -邻域内出现 四、异常检测---基于相似度的方法 - 图69 甚至更多个相邻点, 则判定对象 四、异常检测---基于相似度的方法 - 图70 不是异常值。该算法时间复杂度在最坏情况下为 四、异常检测---基于相似度的方法 - 图71 其中 四、异常检测---基于相似度的方法 - 图72 是数据集维数, 四、异常检测---基于相似度的方法 - 图73 是数据集包含对象的个数。该算法在数据集的维数增加时具有较好的扩展性,但是时间复杂度的估算仅考虑了搜索时间,而构造索引的任务本身就需要密集复杂的计算量。

3、基于密度的度量

基于密度的算法主要有局部离群因子(LocalOutlierFactor,LOF),以及LOCI、CLOF等基于LOF的改进算法。下面我们以LOF为例来进行详细的介绍和实践。
基于距离的检测适用于各个集群的密度较为均匀的情况。在下图中,离群点B容易被检出,而若要检测出较为接近集群的离群点A,则可能会将一些集群边缘的点当作离群点丢弃。而LOF等基于密度的算法则可以较好地适应密度不同的集群情况。
图4.1距离检测的困境-离群点A.png
那么,这个基于密度的度量值是怎么得来的呢?还是要从距离的计算开始。类似k近邻的思路,首先我们也需要来定义一个“k-距离”。

3.1 k-距离(k-distance(p)):

对于数据集四、异常检测---基于相似度的方法 - 图75中的给定对象四、异常检测---基于相似度的方法 - 图76,对象四、异常检测---基于相似度的方法 - 图77与数据集四、异常检测---基于相似度的方法 - 图78中任意点四、异常检测---基于相似度的方法 - 图79的距离为四、异常检测---基于相似度的方法 - 图80。我们把数据集四、异常检测---基于相似度的方法 - 图81中与对象四、异常检测---基于相似度的方法 - 图82距离最近的四、异常检测---基于相似度的方法 - 图83个相邻点的最远距离表示为四、异常检测---基于相似度的方法 - 图84,把距离对象四、异常检测---基于相似度的方法 - 图85距离第四、异常检测---基于相似度的方法 - 图86近的点表示为四、异常检测---基于相似度的方法 - 图87,那么给定对象四、异常检测---基于相似度的方法 - 图88和点四、异常检测---基于相似度的方法 - 图89之间的距离四、异常检测---基于相似度的方法 - 图90,满足:

  • 在集合四、异常检测---基于相似度的方法 - 图91中至少有不包括四、异常检测---基于相似度的方法 - 图92在内的四、异常检测---基于相似度的方法 - 图93个点 四、异常检测---基于相似度的方法 - 图94,其中四、异常检测---基于相似度的方法 - 图95,满足四、异常检测---基于相似度的方法 - 图96
  • 在集合四、异常检测---基于相似度的方法 - 图97中最多有不包括四、异常检测---基于相似度的方法 - 图98在内的四、异常检测---基于相似度的方法 - 图99个点四、异常检测---基于相似度的方法 - 图100,其中四、异常检测---基于相似度的方法 - 图101,满足四、异常检测---基于相似度的方法 - 图102

直观一些理解,就是以对象四、异常检测---基于相似度的方法 - 图103为中心,对数据集四、异常检测---基于相似度的方法 - 图104中的所有点到四、异常检测---基于相似度的方法 - 图105的距离进行排序,距离对象四、异常检测---基于相似度的方法 - 图106四、异常检测---基于相似度的方法 - 图107近的点四、异常检测---基于相似度的方法 - 图108四、异常检测---基于相似度的方法 - 图109之间的距离就是k-距离

3.2 k-邻域(k-distance neighborhood):

由k-距离,我们扩展到一个点的集合——到对象四、异常检测---基于相似度的方法 - 图110的距离小于等于k-距离的所有点的集合,我们称之为k-邻域:四、异常检测---基于相似度的方法 - 图111

  • k-邻域包含对象四、异常检测---基于相似度的方法 - 图112的第四、异常检测---基于相似度的方法 - 图113距离以内的所有点,包括第四、异常检测---基于相似度的方法 - 图114距离点。
  • 对象四、异常检测---基于相似度的方法 - 图115的第四、异常检测---基于相似度的方法 - 图116邻域点的个数四、异常检测---基于相似度的方法 - 图117

在二维平面上展示出来的话,对象四、异常检测---基于相似度的方法 - 图118的k-邻域实际上就是以对象四、异常检测---基于相似度的方法 - 图119为圆心、k-距离为半径围成的圆形区域。就是说,k-邻域已经从“距离”这个概念延伸到“空间”了。
image.png

3.3 可达距离(reachability distance):

有了邻域的概念,我们可以按照到对象四、异常检测---基于相似度的方法 - 图121的距离远近,将数据集四、异常检测---基于相似度的方法 - 图122内的点按照到四、异常检测---基于相似度的方法 - 图123的距离分为两类:

  • 四、异常检测---基于相似度的方法 - 图124在对象四、异常检测---基于相似度的方法 - 图125的k-邻域内,则可达距离就是给定点四、异常检测---基于相似度的方法 - 图126关于对象o的k-距离;
  • 四、异常检测---基于相似度的方法 - 图127在对象四、异常检测---基于相似度的方法 - 图128的k-邻域外,则可达距离就是给定点四、异常检测---基于相似度的方法 - 图129关于对象o的实际距离。

给定点四、异常检测---基于相似度的方法 - 图130关于对象$o$的可达距离用数学公式可以表示为:
四、异常检测---基于相似度的方法 - 图131 。 这样的分类处理可以简化后续的计算,同时让得到的数值区分度更高。
image.png
如图:

  • 四、异常检测---基于相似度的方法 - 图133在对象四、异常检测---基于相似度的方法 - 图134的k-邻域内,四、异常检测---基于相似度的方法 - 图135,可达距离四、异常检测---基于相似度的方法 - 图136 ;
  • 四、异常检测---基于相似度的方法 - 图137在对象四、异常检测---基于相似度的方法 - 图138的k-邻域外,四、异常检测---基于相似度的方法 - 图139,可达距离四、异常检测---基于相似度的方法 - 图140 ;

注意:这里用的是四、异常检测---基于相似度的方法 - 图141四、异常检测---基于相似度的方法 - 图142的距离四、异常检测---基于相似度的方法 - 图143四、异常检测---基于相似度的方法 - 图144的k-距离四、异常检测---基于相似度的方法 - 图145来进行比较,不是与四、异常检测---基于相似度的方法 - 图146进行比较!
可达距离的设计是为了减少距离的计算开销,四、异常检测---基于相似度的方法 - 图147的k-邻域内的所有对象四、异常检测---基于相似度的方法 - 图148的k-距离计算量可以被显著降低,相当于使用一个阈值把需要计算的部分“截断”了。这种“截断”对计算量的降低效果可以通过参数四、异常检测---基于相似度的方法 - 图149来控制,四、异常检测---基于相似度的方法 - 图150的值越高,无需计算的邻近点越多,计算开销越小。但是另一方面,四、异常检测---基于相似度的方法 - 图151的值变高,可能意味着可达距离变远,对集群点和离群点的区分度可能变低。因此,如何选择四、异常检测---基于相似度的方法 - 图152值,是LOF算法能否达到效率与效果平衡的重要因素

3.4 局部可达密度(local reachability density):

我们可以将“密度”直观地理解为点的聚集程度,就是说,点与点之间距离越短,则密度越大。在这里,我们使用数据集四、异常检测---基于相似度的方法 - 图153中对象四、异常检测---基于相似度的方法 - 图154与对象四、异常检测---基于相似度的方法 - 图155的k-邻域内所有点的可达距离平均值的倒数(注意,不是导数)来定义局部可达密度
在进行局部可达密度的计算的时候,我们需要避免数据集内所有数据落在同一点上,即所有可达距离之和为0的情况:此时局部密度为∞,后续计算将无法进行。LOF算法中针对这一问题进行了如下的定义:对于数据集四、异常检测---基于相似度的方法 - 图156内的给定对象四、异常检测---基于相似度的方法 - 图157,存在至少四、异常检测---基于相似度的方法 - 图158个不同于四、异常检测---基于相似度的方法 - 图159的点。因此,我们使用对象四、异常检测---基于相似度的方法 - 图160四、异常检测---基于相似度的方法 - 图161的可达距离四、异常检测---基于相似度的方法 - 图162作为度量对象四、异常检测---基于相似度的方法 - 图163邻域的密度的值。
给定点p的局部可达密度计算公式为:四、异常检测---基于相似度的方法 - 图164
由公式可以看出,这里是对给定点p进行度量,计算其邻域内的所有对象o到给定点p的可达距离平均值。给定点p的局部可达密度越高,越可能与其邻域内的点 属于同一簇;密度越低,越可能是离群点。

3.5 局部异常因子:

得到lrd(局部可达密度)以后就可以将每个点的lrd将与它们的k个邻点的lrd进行比较,得到局部异常因子LOF。更具体地说,LOF在数学上是对象四、异常检测---基于相似度的方法 - 图165的邻居点四、异常检测---基于相似度的方法 - 图166四、异常检测---基于相似度的方法 - 图167)的lrd平均值与四、异常检测---基于相似度的方法 - 图168的lrd的比值
image.png
不难看出,四、异常检测---基于相似度的方法 - 图170的局部可达密度越低,且它的四、异常检测---基于相似度的方法 - 图171近邻的平均局部可达密度越高,则四、异常检测---基于相似度的方法 - 图172的LOF值越高。
如果这个比值越接近1,说明o的邻域点密度差不多,o可能和邻域同属一簇;如果这个比值小于1,说明o的密度高于其邻域点密度,o为密集点;如果这个比值大于1,说明o的密度小于其邻域点密度,o可能是异常点。
由公式计算出的LOF数值,就是我们所需要的离群点分数。

参考资料

[1]《Outlier Analysis》——Charu C. Aggarwal
[2] LOF: Identifying Density-Based Local Outliers
关于Datawhale
Datawhale是一个专注于数据科学与AI领域的开源组织,汇集了众多领域院校和知名企业的优秀学习者,聚合了一群有开源精神和探索精神的团队成员。Datawhale以“for the learner,和学习者一起成长”为愿景,鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。