【异常检测】局部离群因子(LOF):识别基于密度的局部异常值(文献学习)

LOF: Identifying Density-Based Local Outliers

Markus M. Breunig, Hans-Peter Kriegel, Raymond T. Ng, Jörg Sander
Proc. ACM SIGMOD 2000 Int. Conf. On Management of Data, Dalles, TX, 2000

局部离群因子(LOF):识别基于密度的局部异常值

摘要

对于许多KDD应用程序,例如检测电子商务中的犯罪活动、发现罕见的实例或异常值,可能比发现常见的模式更有趣。现有的离群点检测工作把离群点看作是一个二元属性。在本文中,我们认为在许多情况下,为每个对象指定一个异常值的程度更有意义。这个程度称为对象的局部离群因子(Local Outlier Factor, LOF)。它是局部的,因为程度取决于对象相对于周围邻域的隔离程度。我们给出了详细的形式化分析,表明LOF具有许多理想的性质。通过使用真实世界的数据集,我们证明了LOF可以用来发现异常值,这些异常值似乎是有意义的,但是不能用现有的方法来识别。最后,对算法的性能进行了详细的评估,结果表明,该算法是可行的。
关键词: 离群点检测,数据挖掘

1. 引言

越来越多的数据被收集并存储在数据库中,这就需要有高效和有效的分析方法来利用数据中隐含的信息。数据库中的知识发现(KDD)被定义为从数据中识别有效、新颖、潜在有用且最终可理解的知识的非平凡过程。
KDD中的大多数研究集中于寻找适用于数据集中相当大一部分对象的模式。然而,对于诸如侦查各种犯罪活动(例如电子商务中的犯罪活动)等应用而言,罕见事件、偏离多数或例外情况可能比常见的情况更有趣和有用。然而,在KDD社区中,发现这样的异常和离群值还没有像其他一些主题(如关联规则)那样受到重视。
近年来,对大数据集的离群点检测进行了一些研究。虽然第2节将对这些研究进行更详细的讨论,但在此指出,大多数研究都将异常值视为二元属性。也就是说,数据集中的对象是否是异常值。对于许多应用程序,情况更为复杂。为每个对象指定一个异常值的程度就变得更有意义了。
与离群点检测相关的还有大量关于聚类算法的工作。从聚类算法的观点来看,离群点是不在数据集聚类中的对象,通常称为噪声。然而,由聚类算法产生的噪声集高度依赖于特定的算法及其聚类参数。只有少数方法与异常点检测直接相关。一般来说,这些算法从更全局的角度考虑异常值,这也有一些主要的缺点。这些缺点将在第2节和第3节中详细讨论。此外,基于这些聚类算法,作为离群点的属性也是二元的。
本文介绍了一种在多维数据集中寻找离群点的新方法。我们为数据集中的每个对象引入一个局部离群值(LOF),表示其离群程度。据我们所知,这是离群值的第一个概念,它也量化了对象的离群程度。离群因子是局部的,即只考虑每个对象的一个受限邻域。我们的方法与基于密度的聚类松散相关。然而,我们的方法不需要任何显式或隐式的集群概念。具体而言,我们在本文中的技术贡献如下:

  • 在介绍了LOF的概念之后,分析了LOF的形式化性质。我们证明了对于集群(也称簇/聚类, cluster)中的大多数对象,它们的LOF大约等于1。对于任何其他对象,我们给出其LOF的上下界。这些边界突出了LOF的本地特性。此外,我们还分析了这些边界何时是紧的。我们确定对象类的边界是紧的。最后,对于边界不紧的对象,我们提供了更清晰的边界。
  • 对象的LOF基于MinPts的单个参数,MinPts是用于定义对象局部邻域的最近邻数。我们研究了这个参数如何影响LOF值,并给出了选择MinPts值来寻找局部异常值的实用指南。
  • 最后,我们给出了实验结果,显示了发现局部异常值的能力和性能。我们的结论是,使用LOF查找局部异常值是有意义和有效的。

论文的结构如下。在第二节中,我们讨论了离群点检测的相关工作及其缺点。在第3节中,我们详细讨论了离群值概念的动机,特别是离群值的局部视图而不是全局视图的优势。在第4节中,我们将介绍LOF并定义其他辅助概念。在第五节中,我们深入分析了LOF的形式化性质。由于LOF需要单参数MinPts,在第6节中我们分析了参数的影响,并讨论了选择MinPts值进行LOF计算的方法。在第7节中,我们进行了广泛的实验评估。

2. 相关工作

以往关于离群点检测的研究大多是在统计学领域进行的。这些研究大致可分为两类。第一类是基于分布的,其中使用标准分布(如正态分布、泊松分布等)来最佳拟合数据。离群值的定义基于概率分布。已经为不同的场景开发了100多个此类测试,称为不一致性测试。这类测试的一个主要缺点是,大多数使用的分布是单变量的。有些测试是多元的(例如多元正态异常值)。但是对于许多KDD应用程序,底层的分布是未知的。用标准分布拟合数据是昂贵的,而且可能不会产生令人满意的结果。
统计学中的第二类离群值研究是基于深度的。每个数据对象表示为k-d空间中的一个点,并指定一个深度。对于离群点检测,离群点更可能是深度较小的数据对象。已经提出了许多深度的定义。从理论上讲,基于深度的方法可以适用于k的大值。然而,在实践中,虽然存在k=2或3的有效算法([16]、[18]、[12]),但对于k≥4的大数据集,基于深度的方法变得低效。这是因为基于深度的方法依赖于k-d凸包的计算,对于n个对象,k-d凸包的下限复杂度为Ω(nk/2)。
Knorr和Ng提出了基于距离的离群值的概念。它们的概念概括了基于分布的方法的许多概念,并且对于较大的k值,它们的计算复杂度比基于深度的方法更好。在第3节的后面,我们将详细讨论它们的概念与本文提出的局部离群值的概念有何不同。通过使用到k近邻的距离来对离群值进行排序,扩展了基于距离的离群值的概念。给出了一种非常有效的算法来计算排名前n位的离群值,但离群值的概念仍然是基于距离的。
鉴于该领域的重要性,欺诈检测比一般的离群点检测领域受到了更多的关注。根据应用领域的具体情况,已经开发了详细的欺诈模型和欺诈检测算法。与欺诈检测相比,目前讨论的异常点检测工作更具探索性。异常点检测确实可能导致欺诈模型的构建。
最后,大多数聚类算法,尤其是在KDD环境下开发的算法(例如CLARANS、DBSCAN、BIRCH、STING、WaveCluster、DenClue、CLIQUE),在某种程度上能够处理异常。然而,由于聚类算法的主要目标是寻找聚类,因此它们是用来优化聚类的,而不是用来优化离群点的检测。在生成聚类结果时,通常只允许或忽略异常(在聚类的背景下称为“噪声”)。即使不忽略离群值,离群值的概念本质上是二元的,并且对于对象的离群程度没有量化。我们的局部离群值概念与基于密度的聚类方法有一些基本概念。然而,我们的离群点检测方法不需要任何显式或隐式的聚类概念。

3. 现有(非局部)方法的问题

正如我们在第2节中所看到的,现有的离群点检测的大部分工作都在统计学领域。直观地,Hawkins给出了离群值的定义。
**定义1:**霍金斯离群值(Hawkins-Outlier)

离群值是一种与其他观测值相差甚远的观测值,以至于引起人们怀疑它是由另一种机制产生的。

Knorr和Ng在下面的离群值定义中对这一概念进行了形式化描述。在本文中,我们使用o,p,q来表示数据集中的对象。我们使用符号d(p,q)来表示对象p和q之间的距离。对于一组对象,我们使用C(有时直觉地认为C形成一个簇)。为了简化我们的表示法,我们用d(p,C)来表示C中p和q之间的最小距离,即 d ( p , C ) = min ⁡ { d ( p , q ) ∣ q ∈ C } . d(p,C) = \min \{ d(p,q)|q \in C\} . d(p,C)=min{d(p,q)qC}.
**定义2:**DB(pct, dmin) - 离群值

数据集D中的对象p是DB(pct,dmin)-离群值,如果D中的对象的最小百分比pct大于距离dmin,即集合${ q \in D|d(p,q) \le d\min } $的基数小于或等于D大小的(100−pct)%。

上面的定义只捕获某些类型的异常值。因为定义采用数据集的全局视图,所以这些异常值可以被视为“全局”异常值。然而,对于许多表现出更复杂结构的有趣的真实世界数据集,存在另一种异常值。这些对象可以是相对于他们的局部近邻,特别是相对于近邻的密度。这些离群值被视为“局部”离群值。

为了进行说明,请考虑图1中给出的示例。这是一个包含502个对象的简单二维数据集。第一个簇C1中有400个对象,簇C2中有100个对象,另外还有两个对象o1和o2。在这个例子中,C2形成了比C1更密集的团簇。根据霍金斯的定义,o1和o2都可以被称为离群值,而C1和C2中的对象则不应该被称为离群值。有了“局部”异常值的概念,我们希望将o1和o2都标记为异常值。相反,在基于距离的离群值框架内,只有o1是以下意义上的合理DB(pct,dmin)-离群值。如果对于C1中的每个对象q,q与其最近邻之间的距离大于o2与C2之间的距离(即d(o2,C2)),我们实际上可以证明没有合适的pct和dmin值,因此o2是DB(pct,dmin)-离群值,但C1中的对象不是。
原因如下。如果dmin值小于距离d(o2,C2),则所有501个对象(pct=100×501/502)都比dmin离o2更远。但同样的条件也适用于C1中的每个物体q。因此,在这种情况下,o2和C1中的所有对象都是DB(pct,dmin)-离群值。
否则,如果dmin值大于距离d(o2,C2),则很容易看出:o2是DB(pct,dmin)-离群值意味着C1中有许多对象q,使得q也是DB(pct,dmin)离群值。这是因为集合{p∈D | d(p,o2)≤ dmin}的基数总是大于集合{p∈D | d(p,q)≤ dmin}的基数。因此,在这种情况下,如果o2是DB(pct,dmin)-离群值,那么C1中的许多对象q也是离群值。更糟糕的是,有pct和dmin的值,这样,虽然o2不是异常值,但C1中的一些q是异常值。

4. 局部离群值的正式定义

上面的例子表明,DB(pct,dmin)-离群值所取的全局视图在某些条件下是有意义的和足够的,但是对于存在不同密度的簇的一般情况来说并不令人满意。在本节中,我们开发了局部异常值的正式定义,这避免了上一节中提出的缺点。我们的概念和现有的离群值概念之间的关键区别在于,离群不是二元属性。相反,我们为每个对象指定一个离群因子,即对象的离群程度。
**定义3:**k-距离(k-distance)

对于任意正整数k,对象p的k距离,表示为k-distance§,定义为p与对象o∈D之间的距离d(p,o),使得:
(i) 至少有k个对象o’∈D{p},使得d(p, o’) ≤ d(p, o)
(ii) 至多有k-1个对象o’∈D{p},使得d(p, o’) < d(p, o)

【其中D为数据集(Database)。通俗的说,某一点p的k距离(k-distance),就是点p和距离点p第k近的点之间距离(不包括点p)】
**定义4:**k-距离邻域(k-distance neighborhood)

给定p的k-距离,p的k-距离邻域包含与p的距离不大于k-距离的每个对象,即Nk-distance§ = {q∈D \ {p} | d(p, q)≤ k-distance§}
这些对象q称为p的k个近邻。简化表示为Nk§

【所谓p的k距离邻域,就是p的直线距离不超过p的k-距离的所有数据样本构成的集合(集合中至少应有k个元素)】
例如,假设有
(i) 1个对象与p的距离为1个单位;
(ii) 2个对象与p的距离为2个单位;
(iii) 3个对象与p的距离为3个单位。
如下图所示:

那么,2-distance§ = 3-distance§ = 2,N4-distance§ = 6.
**定义5:**可达距离(reachability distance)

令k为自然数,将对象p相对于对象o的可达距离定义为
reach-distk(p, o) = max{k-distance(o), d(p, o)}

图2说明了k=4时可达距离的概念。

直观地说,如果对象p远离o(例如图中的p2),那么两者之间的可达距离就是它们的实际距离。然而,如果它们“足够”接近(例如,图中的p1),实际距离将被o的k距离代替。原因是这样做,所有p接近o的统计波动d(p,o)可以显著减少。这种平滑效果的强度可以通过参数k来控制。k值越高,同一邻域内的对象的可达距离越相似。
到目前为止,我们已经为任何正整数k定义了k-distance(p)和reach-distk§。但是为了定义离群值,我们将重点放在k的一个特定实例上,该实例将我们与基于密度的聚类联系起来。在典型的基于密度的聚类算法中,有两个参数定义了密度的概念:(i)指定最小对象数的参数MinPts;(ii)指定容积的参数。这两个参数决定了聚类算法的密度阈值。也就是说,如果对象或区域的邻域密度超过给定的密度阈值,则对象或区域是连接的。然而,为了检测基于密度的异常值,需要比较不同对象集的密度,这意味着我们必须动态地确定对象集的密度。因此,我们将MinPts作为唯一的参数,并使用reach distMinPts(p,o),对于o∈NMinPts§,作为容积的度量来确定对象p附近的密度。
**定义6:**局部可达密度((local reachability density)
对象p的局部可达密度定义为:
l r d M i n P t s ( p ) = 1 / ( ∑ o ∈ N M i n P t s ( p ) r e a c h − d i s t M i n P t s ( p , o ) ∣ N M i n P t s ( p ) ∣ ) lr{d_{MinPts}}(p) = 1/(\frac{{\sum\limits_{o \in {N_{MinPts}}(p)} {reach - dis{t_{MinPts}}(p,o)} }}{{\left| {{N_{MinPts}}(p)} \right|}}) lrdMinPts(p)=1/(NMinPts(p)oNMinPts(p)reachdistMinPts(p,o))
直观地说,对象p的局部可达性密度是基于p的最近邻的平均可达距离的倒数。注意,如果求和中的所有可达性距离都为0,则局部密度可以是∞。如果至少存在与p不同但共享相同空间坐标的MinPts对象,即如果数据集中至少存在p的MinPts副本,则对象p可能会发生这种情况。为了简单起见,我们不会显式地处理这种情况,而是简单地假设没有重复的情况。(为了处理重复,我们可以将邻域的概念建立在k-不同距离的基础上,定义类似于定义3中的k-距离,另外要求至少有k个具有不同空间坐标的对象。)
定义7:(局部)离群因子(((local) outlier factor)
对象p的(局部)离群因子定义为:
L O F M i n P t s ( p ) = ∑ o ∈ N M i n P t s ( p ) l r d M i n P t s ( o ) l r d M i n P t s ( p ) ∣ N M i n P t s ( p ) ∣ LO{F_{MinPts}}(p) = \frac{{\sum\limits_{o \in {N_{MinPts}}(p)} {\frac{{lr{d_{MinPts}}(o)}}{{lr{d_{MinPts}}(p)}}} }}{{\left| {{N_{MinPts}}(p)} \right|}} LOFMinPts(p)=NMinPts(p)oNMinPts(p)lrdMinPts(p)lrdMinPts(o)
对象p的离群因子反映了我们称p为离群值的程度。它是p的局部可达密度与p的最小近邻可达密度之比的平均值。不难看出,p的局部可达密度越低,p的MinPts近邻的局部可达密度越高,p的LOF值就越高。在下一节中,LOF的形式化性质将得到精确的证明(此略)。为了简化表示法,如果没有出现混淆,我们从reach-dist、lrd和LOF中删除下标MinPts。

5. 局部离群点的性质

在本节中,我们对LOF的性质进行了详细的分析。我们的目标是证明我们对LOF的定义抓住了局部异常值的精神,并且具有许多令人满意的性质。具体地说,我们证明了对于簇中的大多数对象p,p的LOF大约等于1。对于其他对象,包括簇外的对象,我们给出了LOF上下界和上界的一般定理。此外,我们还分析了边界的紧性。我们证明了重要对象类的界是紧的。但是,对于其他类的对象,边界可能没有那么紧。对于后者,我们给出了另一个更好的界定理。

5.1 簇内深层对象的LOF

在第3节中,我们使用图1来激发局部异常值的概念。特别是,我们希望将o2标记为外围对象,但将集群C1中的所有对象标记为非外围对象。下面,我们展示了对于C1中的大多数对象,其LOF大约为1,这表明它们不能被标记为外围对象。
**引理1:**设C是对象的集合。让reach-dist-min表示C中对象的最小可达距离,即reach-dist-min=min{reach-dist(p,q)| p,q∈C}。同样,让reach-dis-max表示C中对象的最大可达距离。将ε定义为(reach-dist-max/reach-dist-min − 1).
对于所有对象p∈C,有:
(i) p的所有MinPts-最近邻q都在C中,且
(ii)q的所有MinPts-最近邻o也在C中,则有1/(1+ε) ≤LOF§ ≤ (1+ε) .
引理1的解释如下。直观地说,C对应于一个“簇”。让我们考虑群集中“深”的对象p,这意味着p的所有MinPts近邻q都在C中,而q的所有MinPts近邻也都在C中。对于这样的深对象p,p的LOF是有界的。如果C是一个“紧”簇,引理1中的ε值可能非常小,从而迫使p的LOF非常接近1。
为了返回到图1中的示例,我们可以应用引理1得出结论,集群C1中大多数对象的LOF接近1。

5.2 LOF的一般上界和下界

上面的引理1显示了LOF的一个基本性质,即对于集群中的深层对象,它们的LOF接近于1,不应该被标记为局部异常值。我马上想到几个问题。那些靠近星团外围的物体呢?那么那些在簇外的物体呢,比如图1中的o2?我们能得到这些物体LOF的上下限吗?
下面的定理1给出了任意对象p的LOF§的一般上下界。因此,定理1沿着二维推广了引理1。首先,定理1适用于任何对象p,并不局限于簇内的对象。第二,即使对于团簇内部的物体,定理1给出的界也比引理1给出的界更紧,这意味着引理1中定义的ε可以更接近于零。这是因为在引理1中,reach-dist-min和reach-dist-max的值是基于一组较大的可达距离得到的。相反,在定理1中,最小值和最大值仅基于所考虑对象的最小最近邻域,导致更严格的界限。在第5.3节中,我们将更详细地分析定理1中给出的界的紧性。
定义下列项:
d i r e c t min ⁡ ( p ) = min ⁡ { r e a c h − d i s t ( p , q ) ∣ q ∈ N M i n P t s ( p ) } direc{t_{\min }}(p) = \min \{ reach - dist(p,q)|q \in {N_{MinPts}}(p)\} directmin(p)=min{reachdist(p,q)qNMinPts(p)}
d i r e c t max ⁡ ( p ) = max ⁡ { r e a c h − d i s t ( p , q ) ∣ q ∈ N M i n P t s ( p ) } direc{t_{\max }}(p) = \max \{ reach - dist(p,q)|q \in {N_{MinPts}}(p)\} directmax(p)=max{reachdist(p,q)qNMinPts(p)}
i n d i r e c t min ⁡ ( p ) = min ⁡ { r e a c h − d i s t ( p , q ) ∣ q ∈ N M i n P t s ( p ) } indirec{t_{\min }}(p) = \min \{ reach - dist(p,q)|q \in {N_{MinPts}}(p)\} indirectmin(p)=min{reachdist(p,q)qNMinPts(p)}
i n d i r e c t max ⁡ ( p ) = max ⁡ { r e a c h − d i s t ( p , q ) ∣ q ∈ N M i n P t s ( p ) } indirec{t_{\max }}(p) = \max \{ reach - dist(p,q)|q \in {N_{MinPts}}(p)\} indirectmax(p)=max{reachdist(p,q)qNMinPts(p)}
**定理1:**令p是数据集D中的一个对象,且1≤MinPts≤|D|,则
d i r e c t min ⁡ ( p ) i n d i r e c t max ⁡ ( p ) ≤ L O F ( p ) ≤ d i r e c t max ⁡ ( p ) i n d i r e c t min ⁡ ( p ) \frac{{direc{t_{\min }}(p)}}{{indirec{t_{\max }}(p)}} \le LOF(p) \le \frac{{direc{t_{\max }}(p)}}{{indirec{t_{\min }}(p)}} indirectmax(p)directmin(p)LOF(p)indirectmin(p)directmax(p)
为了用图3中的例子来说明这个定理,假设dmin是imax的4倍,dmax是imin的6倍。然后根据定理1,p的LOF在4到6之间。从定理1中也应该清楚,LOF§有一个易于理解的解释。它只是p的直接邻域相对于p的间接邻域的可达距离的函数。

5.3 边界的紧密性

总之,如果直接邻域和间接邻域中平均可达距离的波动很小(即pct很低),则定理1可以很好地估计LOF,因为最小和最大LOF边界彼此接近。有两个重要的情况是这样的。

  • 如果可达距离的波动相当均匀,即p的MinPts近邻属于同一簇,则对象p的pct百分比非常低。在这种情况下,directmin、directmax、indirectmin和indirectmax的值几乎相同,导致LOF接近1。这与引理1中建立的结果是一致的。
  • 上述论点可以推广到一个对象p,该对象p不位于簇的深处,但其MinPts最近的邻居都属于同一簇(如图3所示)。在这种情况下,即使LOF可能不接近1,定理1所预测的LOF的界也是紧的。

5.4 直接邻域与多个簇重叠的对象的边界

到目前为止,我们已经分析了定理1中给出的边界的严密性,并给出了边界严密性的两个条件。一个立即浮现在脑海中的问题是:在什么情况下边界不紧?根据图5,如果物体p的minpts -最近邻属于不同密度的簇,pct的值可能非常大。然后根据图5,LOFmax和LOFmin值之间的差值可以变大。在这种情况下,定理1中给出的边界不能很好地工作。

作为一个例子,让我们再次考虑图1所示的情况。对于对象o2,由于其所有MinPts近邻都来自同一簇C2,因此定理1给出的关于o2的LOF的界应该是紧的。相比之下,o1的MinPts近邻来自C1和C2簇。在这种情况下,o1的LOF的给定界限可能不太好。
下面的定理2旨在给出当p的最小邻域与多个簇重叠时,对象p的LOF的更好的界。定理2的直观意义是,当我们把p的MinPts近邻划分为若干组时,每个组对p的LOF的贡献是成比例的。

**定理2:**令p是数据集D中的一个对象,且1≤MinPts≤|D|,C1,C2,…,Cn是NMinPts§的分割,即NMinPts§=C1∪C2∪…∪Cn∪{p}且Ci∩Cj=∅,Ci≠∅,1≤i,j≤n, i≠j.
此外,令ξi=|Ci|/NMinPts§|
则有:
(a) L O F ( p ) ≥ ∣ ( ∑ i = 1 n ξ i ⋅ d i r e c t min ⁡ i ( p ) ) ∣ ⋅ ∣ ( ∑ i = 1 n ξ i i n d i r e c t max ⁡ i ( p ) ) ∣ LOF(p) \ge \left| {(\sum\limits_{i = 1}^n {{\xi _i}} \cdot direct_{\min }^i(p))} \right| \cdot \left| {(\sum\limits_{i = 1}^n {\frac{{{\xi _i}}}{{indirect_{\max }^i(p)}}} )} \right| LOF(p)(i=1nξidirectmini(p))(i=1nindirectmaxi(p)ξi)
(b) L O F ( p ) ≤ ∣ ( ∑ i = 1 n ξ i ⋅ d i r e c t max ⁡ i ( p ) ) ∣ ⋅ ∣ ( ∑ i = 1 n ξ i i n d i r e c t min ⁡ i ( p ) ) ∣ LOF(p) \le \left| {(\sum\limits_{i = 1}^n {{\xi _i}} \cdot direct_{\max }^i(p))} \right| \cdot \left| {(\sum\limits_{i = 1}^n {\frac{{{\xi _i}}}{{indirect_{\min }^i(p)}}} )} \right| LOF(p)(i=1nξidirectmaxi(p))(i=1nindirectmini(p)ξi)
证明见论文。 定理2泛化了定理1,其中考虑了来自多个聚类的MinPts最近邻的比率。 因此,有以下推论。
推论1:如果定理2中的分割数为1,则定理2中给出的LOFmin和LOFmax与定理1中给出的对应界完全相同。

6. 参数MinPts的影响

在上一节中,我们分析了LOF的形式化性质。对于团簇内部的物体,我们已经证明LOF大约等于1。对于其他对象,我们根据MinPts近邻是否来自一个或多个簇,在LOF上建立了两组上下界。需要注意的是,前面的所有结果都基于给定的MinPts值。在本节中,我们将讨论MinPts值的选择如何影响LOF值,以及如何为LOF计算确定正确的MinPts值。

6.1 LOF如何随MinPts值的变化而变化

鉴于上一节建立的分析结果,我想到了几个有趣的问题。当MinPts值被调整时,LOF值是如何变化的?给定MinPts值的递增序列,LOF是否有相应的单调变化序列?也就是说,LOF是单调地减少还是增加?
不幸的是,实际情况是LOF既不单调地减少也不单调地增加。图7显示了一个简单的场景,其中所有对象都按照高斯分布分布。对于2到50之间的每个MinPts值,显示最小、最大和平均LOF值以及标准偏差。
让我们以最大LOF为例。最初,当MinPts值设置为2时,这将减少到使用定义5中的实际对象间距离d(p,o)。通过增加MinPts值,可以减弱可达距离和LOF的统计起伏。因此,在最大LOF值上存在初始下降。但是,当MinPts值继续增加时,LOF的最大值会上下波动,并最终稳定到某个值。

如果LOF值即使对于高斯分布这样的纯分布也是非单调变化的,那么对于更复杂的情况LOF值变化更大。图8显示了一个包含三个集群的二维数据集,其中S1由10个对象组成,S2由35个对象组成,S3由500个对象组成。右侧是每个簇中一个对象的代表图。图中显示的LOF超过MinPts的范围为10到50。S3中对象的LOF在1附近非常稳定,而S1和S3中对象的LOF变化更大。

6.1 确定MinPts值的范围

因为LOF值可以上下浮动,我们建议使用一系列MinPts值作为一种启发式方法。在下文中,我们将提供如何选取此范围的指导。我们使用MinPtsLB和MinPtsUB来表示范围的“下限”和“上限”。
让我们首先确定MinPtsLB的合理值。显然,MinPtsLB可以小到2。然而,如上所述,在定义5之前,明智的做法是消除不必要的统计波动,因为MinPts太小。例如,对于图7所示的高斯分布,当MinPtsLB至少为10时,LOF的标准偏差才稳定。作为另一个极端的例子,假设我们把图7中的高斯分布变成均匀分布。结果表明,对于小于10的MinPts,可能存在LOF显著大于1的对象。这是违反直觉的,因为在均匀分布中,不应将任何对象标记为外围对象。因此,我们为挑选MinPtsLB提供的第一条准则是,它至少应该是10,以消除不必要的统计波动。
我们为挑选MinPtsLB提供的第二条准则是基于更微妙的观察。考虑一个对象p和一个对象集/簇C的简单情况。如果C包含的对象少于MinPtsLB,那么C中每个对象的MinPts近邻集将包含p,反之亦然。因此,通过应用定理1,p的LOF和C中的所有对象将是非常相似的,从而使p与C中的对象不可区分。
另一方面,如果C包含多个MinPtsLB对象,则C中对象的MinPts最近邻域将不包含p,但C中的一些对象将包含在p的邻域中。因此,取决于p和C之间的距离和C的密度,p的LOF可能与C中的对象的LOF有很大的不同。这里的关键观察是MinPtsLB可以被视为一个“簇”(如上面的C)必须包含的对象的最小数目,因此其他对象(如上面的p)可以是相对于此的局部异常值集群。此值可能取决于应用程序。对于我们实验的大多数数据集,一般来说,选择10到20个数据集似乎效果不错。
接下来,我们来选择一个合理的MinPtsUB值,即MinPts值范围的上限值。与下限MinPtsLB一样,上限也有关联的含义。设C是一组“近距”对象。然后MinPtsUB可以看作是C的最大基数,因为C中的所有对象都可能是局部异常值。“近距”是指directmin、directmax、indirectmin和indirectmax的值都非常相似。在这种情况下,对于超过MinPtsUB的MinPts值,定理1要求C中所有对象的LOF接近1。因此,我们为挑选MinPtsUB提供的指导原则是,可能是局部异常值的“近距”对象的最大数量。
作为一个例子,让我们再次考虑图8所示的情况。回想一下,S1由10个对象组成,S2由35个对象组成,S3由500个对象组成。从图中可以明显看出,S3中的对象从来都不是异常值,它们的LOF值总是接近1。相比之下,S1中的对象是MinPts值介于10和35之间的强异常值。S2中的对象是从MinPts=45开始的异常值。
最后两个效果的原因是,从MinPts=36开始,S2中对象的MinPts最近邻域开始包含S1中的一些对象。从那以后,S1和S2中的对象表现出大致相同的行为。现在,当MinPts=45时,这个“组合”的对象集S1和S2的成员开始在其邻域中包含来自S3的对象,因此开始成为相对于S3的异常值。根据应用程序域的不同,我们可能希望将一组35个对象(如S2)视为一个集群或一堆“近距”的局部异常值。为了便于实现这一点,我们可以相应地选择MinPtsUB值,即小于35或大于35。MinPtsLB也有类似的论点,即相对于其他对象可以被视为局部异常值的最小对象数。
在确定了MinPtsLB和MinPtsUB之后,我们可以为每个对象计算其在此范围内的LOF值。我们提出了一种启发式方法,在指定的范围内,根据最大LOF值对所有对象进行排序。也就是说,对象p的排名基于: max{LOFMinPts§|MinPtsLB≤MinPts≤MinPtsUB}
假设所有的LOF值都在这个范围内,我们可以取其他的聚集值,比如最小值或平均值,而不是取最大值。图8中的情况表明,采用最小值可能是不合适的,因为最小值可能会完全抹去对象的外围特性。取平均值也可能有稀释物体外围性质的效果。我们建议使用最大值来突出显示对象最外围的实例。

7. 实验

在这一节中,我们提出了在这个范围内取最大LOF值的启发式方法,证明了我们的思想可以成功地识别那些看似有意义但其他方法无法识别的异常值。我们从一个综合的二维数据集开始,为它显示所有对象的离群因子,以便给出计算的LOF值的直观概念。第二个示例使用在[KN98]中使用的真实数据集来评估DB(pct,dmin)-离群值。我们重复他们的实验来验证我们的方法。在第三个例子中,我们在一个德国足球运动员的数据库中识别出有意义的异常值,我们正好有一个“领域专家”在手,他证实了发现的异常值的意义。最后一小节包含的性能实验表明,即使对于大型、高维数据集,我们的方法也是可行的。
此外,我们用一个64维的数据集进行了实验,以证明我们的定义在高维空间是合理的。使用的特征向量是从电视快照中提取的彩色直方图。我们识别了多个聚类,例如网球比赛的图片聚类,以及LOF值高达7的合理的局部异常值。

7.1 合成示例

图9的左侧显示了一个二维数据集,其中包含一个由200个对象组成的低密度高斯聚类和三个分别由500个对象组成的大聚类。其中一个是稠密的高斯团簇,另两个是密度不同的均匀团簇。此外,它还包含一些异常值。在图9的右侧,我们将MinPts=40的所有对象的LOF绘制为第三维。我们看到均匀簇中的对象的LOF都等于1。高斯簇中的大多数对象的LOF值也都是1。稍微在高斯聚类之外,有几个弱异常值,即那些相对较低但大于1的LOF值。其余七个对象的LOF值都要大得多。此外,从图中可以清楚地看出,每个离群值的LOF值取决于相对于对象为离群值的簇的密度,以及离群值到簇的距离。

7.2 曲棍球数据

在NHL96数据集上重复实验,计算MinPts范围30到50的最大LOF。
在第一次测试中,在得分的三维子空间上,加减统计和罚分分钟数,他们确定弗拉基米尔·康斯坦季诺夫是唯一的DB(0.998,26.3044)异常值。他也是我们的最高离群值,LOF值为2.4。第二强的局部异常值,LOF为2.0,是Matthew Barnaby。对于发现的大多数离群值,我们不从领域专家的角度解释为什么它们是离群值;感兴趣的读者可以在中找到这些信息。这里的重点是,通过用最大LOF值对异常值进行排序,我们得到了几乎相同的结果。
在第二次测试中,他们在比赛、进球和投篮命中率的三维子空间中识别出DB(0.997,5)异常值,发现克里斯·奥斯古德和马里奥·莱米厄是异常值。同样,他们是我们的顶级离群者,Chris Osgood的LOF为6.0,Mario Lemieux的LOF为2.8。在我们基于LOF的排名榜上,史蒂夫·波普斯特以2.5的LOF排名第三,只打了三场比赛,进了一球,投篮命中率达到50%。

7.3 足球数据

在下面的实验中,我们计算了“Fußball 1 1998/99赛季德国国家足球联盟”足球运动员信息数据库的局部异常值。该数据库由375名球员组成,包括姓名、比赛次数、进球数以及球员的位置(守门员、防守、中锋、进攻)。从中我们得出了每场比赛的平均进球数,并对比赛次数、每场比赛的平均进球数和位置(编码为整数)的三维子空间进行了离群点检测。一般来说,这个数据集可以根据玩家的位置划分为四个簇。我们计算了MinPts范围为30到50的LOF值。下面我们将讨论LOF>1.5的所有局部异常值,并解释为什么它们是例外的。
最强的离群者是迈克尔·普里茨,他踢了最多的比赛,也进了最多的球,这使他成为联盟中得分最高的球员(“托尔施尤琴克尼格”)。相对于一群进攻型球员来说,他是个局外人。第二强的离群者是迈克尔·施约伯格。他打了平均数场比赛,但他是一个离群,因为大多数其他防守球员每场得分的平均数要低得多。原因是他为球队踢了点球。排在第三位的球员是汉斯-约格-巴特,一个踢了最多比赛的守门员进了7个球。他是唯一一个进球的守门员,他也为球队踢进了点球。在排名第四和第五的位置上,我们找到了乌尔夫·克尔斯滕和乔万·埃尔伯,这两个进攻型球员的平均得分非常高。

7.4 性能

在本节中,我们将评估LOF的计算性能。以下实验是在一台运行linux2.2的主存为256mb的奔腾III-450工作站上进行的。所有算法都是用Java实现的,并在IBMJVM1.1.8上执行。使用的数据集是随机生成的,包含不同大小和密度的不同数量的高斯聚类。所有时间都是挂钟时间,即包括CPU时间和i/O时间。
为了计算MinPtsLB和MinPtsUB之间的LOF值,对数据库D中的所有n个对象,我们实现了一个两步算法。在第一步中,找到MinPtsUB最近邻域,在第二步中计算LOF。让我们详细看看这两个步骤。
在第一步中,每个点p的MinPtsUB最近邻被物化,以及它们到p的距离。这一步的结果是一个大小为nMinPtsUB距离的物化数据库M。请注意,此中间结果的大小与原始数据的维度无关。此步骤的运行时复杂度是O(n一次k-nn查询的时间)。于k-nn查询,我们可以在不同的方法中进行选择。对于低维数据,我们可以使用基于网格的方法,该方法可以在固定时间内回答k-nn查询,导致物化步骤的复杂度为O(n)。对于中高维数据,我们可以使用索引,它为k-nn查询提供了O(logn)的平均复杂度,从而导致了O(nlogn)的物化复杂度。对于超高维数据,我们需要使用序列扫描或其变体,例如VA文件,复杂度为O(n),导致物化步骤的复杂性为O(n2)。在我们的实验中,我们使用了X-Tree的一个变体,导致了O(n logn)的复杂性。图10显示了不同维度数据集和MinPtsUB=50的性能实验。显示的时间确实包括建立索引的时间。显然,该索引对于2维和5维数据集非常有效,导致了接近线性的性能,但是对于10维和20维数据集则退化了。众所周知,索引结构的有效性随着维数的增加而降低。
在第二步中,使用物化数据库M来计算LOF值。该步骤不需要原始数据库D,因为M包含足够的信息来计算LOF。对于MinPtsLB和MinPtsUB之间的MinPts的每个值,数据库M被扫描两次。在第一次扫描中,计算每个目标的局部可达密度。在第二步中,计算最终的LOF值并将其写入文件。然后可以使用这些值根据对象在MinPtsLB和MinPtsUB的间隔内的最大LOF值对对象进行排序。该步骤的时间复杂度为O(n)。图11所示的图证实了这一点,其中计算了MinPtsLB=10到MinPtsUB=50的LOF值。

8. 结论

对于许多KDD应用程序来说,发现异常值是一项重要的任务。现有的建议将异常值视为二进制属性。在本文中,我们证明了在许多情况下,作为一个孤立点不是作为一个二进制属性,而是作为一个对象与其周围邻域隔离的程度来考虑是有意义的。我们引入了局部离群因子LOF的概念,它准确地反映了这种相对隔离度。我们证明了LOF的定义具有许多理想的性质。对于簇内较深的对象,LOF值约为1。对于其他对象,我们给出了LOF值的严格上下界,而不管MinPts最近邻是否来自一个或多个簇。此外,我们还分析了LOF值如何依赖于MinPts参数。我们给出了如何选择一系列MinPts值的实用指南,并提出了在所选范围内根据最大LOF值对对象进行排序的启发式方法。实验结果表明,我们的启发式算法是非常有前途的,因为它可以识别有意义的局部离群点,以前的方法无法找到。最后但并非最不重要的一点是,我们证明了我们的局部离群点查找方法对于索引结构支持最近邻查询的数据集是有效的,并且对于非常大的数据集仍然是实用的。
目前的工作有两个方向。第一个问题是如何描述或解释为什么识别出的局部异常值是异常的。这对于高维数据集尤其重要,因为局部异常值可能仅在某些维度上存在,而不是在所有维度上存在。二是进一步提高LOF计算的性能。对于这两个方向,研究LOF计算如何使用分层聚类算法(如OPTICS)进行“握手”是很有趣的。一方面,这样的算法可以提供关于局部离群点的更详细的信息,例如,通过分析与离群点相关的簇。另一方面,LOF处理和聚类之间可以共享计算。共享计算可以包括k-nn查询和可达距离。

附:方法复现

方法复现数据和源码已上传至Github仓库( https://github.com/xzydn/anomaly-detection-example/tree/master/LocalOutlierFactor(LOF) )
算法实现参考了“我是8位的”的博文( https://www.cnblogs.com/bigmonkey/p/11052019.html )
主要代码如下。计算结果与sklearn中实现方法计算结果相一致。

# -*- coding: utf-8 -*-
import numpy as np
from scipy.spatial.distance import cdist
from sklearn.neighbors import LocalOutlierFactor


class LOF:
    """
    局部离群因子类
    """

    def __init__(self, X):
        self.X = X
        self.D_K = []  # X中每个样本点的k距离
        self.NEIGHBORS = []  # X中每个样本点的k距离邻域
        self.LRD = []  # X中每个样本点的局部可达密度
        self.k = None
        self.LOF = []  # 局部异常因子
        self.dist = cdist(X, X, metric='euclidean')  # 计算任意两点之间距离
        print("X shape:", np.shape(X))

    def calc_lof(self, k):
        # 计算LOF
        X = self.X
        self.lof_init(k)
        self.calc_lrd()
        for i in range(0, len(X)):  # 计算每个样本点的局部离群因子
            self.LOF[i] = self.lof(i)

    def lof_init(self, k):
        # 计算LOF初始化
        self.k = k
        X = self.X
        self.D_K = np.zeros(len(X))  # X中每个样本点的k距离
        self.NEIGHBORS = []  # X中每个样本点的k距离邻域
        self.LRD = np.zeros(len(X))  # X中每个样本点的局部可达密度
        self.LOF = np.zeros(len(X))  # 局部异常因子

    def calc_lrd(self):
        # 计算局部可达密度
        k = self.k
        X = self.X
        for i in range(0, len(X)):
            # print(i)
            # x_i距所有样本点的欧几里得距离
            x_and_d = self.dist[i, :]
            index_x_and_d = np.argsort(x_and_d)  # 将特征值按从小到大排序,index保留的是对应原矩阵中的下标
            self.D_K[i] = x_and_d[index_x_and_d[k]]  # x_i的k距离,此处假设x_and_d中没有重复的距离,除去自身点
            # self.NEIGHBORS.append(index_x_and_d[1:k + 1])  # x_i的k距离邻域,除去自身点(这里有问题,至少有k个)
            neighbors = np.argwhere(x_and_d <= self.D_K[i])
            self.NEIGHBORS.append([x[0] for x in neighbors if x[0] != i]) # x_i的k距离邻域,除去自身点
        for i in range(0, len(X)):  # 计算每个样本点的局部可达密度
            self.LRD[i] = self.lrd(i)

    def lrd(self, p):
        # p的局部可达密度
        neighbors = self.NEIGHBORS[p]
        rd = np.maximum(self.D_K[neighbors], self.dist[p, neighbors])
        return 1 / (np.sum(rd) / len(neighbors))

    def lof(self, p):
        # p的局部离群因子
        neighbors = self.NEIGHBORS[p]
        return np.sum(self.LRD[neighbors]) / self.LRD[p] / len(neighbors)


def create_train():
    np.random.seed(42)  # 设置seed使每次生成的随机数都相等
    # 生成100个2维数据,它们是以0为均值、以1为标准差的正态分布
    X_inliers = 0.3 * np.random.randn(100, 2)
    # 构造两组间隔一定距离的样本点作为训练数据
    X_inliers = np.r_[X_inliers + 2, X_inliers - 2]
    # 构造20个可能的异常数据,从一个均匀分布[low,high)中随机采样
    X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))
    # 将X_inliers和X_outliers连接起来作为训练集
    return np.r_[X_inliers, X_outliers]


def lof_sklearn(X, k):
    clf = LocalOutlierFactor(n_neighbors=k)
    clf.fit_predict(X)
    LOF = -clf.negative_outlier_factor_
    return LOF


if __name__ == '__main__':
    X = create_train()
    k = 20

    lof = LOF(X)
    lof.calc_lof(k)
    print("LOF Mine:\n", lof.LOF)

    LOF_skleran = lof_sklearn(X, k)
    print("LOF sklearn:\n", LOF_skleran)

并尝试对论文7.2中NHL曲棍球数据( http://inalitic.com/datasets/nhl%20player%20data.html )进行复现。
原始数据

LOF直方图

根据LOF计算结果,可自定义阈值滤除异常点。滤除结果如下:

仅供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值