为什么需要LOF
在数据挖掘方面,经常需要在做特征工程和模型训练之前对数据进行清洗,剔除无效数据和异常数据。异常检测也是数据挖掘的一个方向,用于反作弊、伪基站、金融诈骗等领域。
异常检测方法,针对不同的数据形式,有不同的实现方法。常用的有基于分布的方法,在上、下α分位点之外的值认为是异常值(例如图1),对于属性值常用此类方法。基于距离的方法,适用于二维或高维坐标体系内异常点的判别,例如二维平面坐标或经纬度空间坐标下异常点识别,可用此类方法。
这次要介绍一下一种基于距离的异常检测算法,局部异常因子LOF算法(Local Outlier Factor)。
用视觉直观的感受一下,如图2,对于
C
1
C_1
C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于
C
2
C_2
C2集合的点,同样可认为是一簇。
o
1
o_1
o1、
o
2
o_2
o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足
C
1
C_1
C1和
C
2
C_2
C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
概念与公式
-
d(A,B):两点间的距离
-
k-distance: d i s t a n c e k ( o ) distance_k(o) distancek(o)----- o的第k距离(也就是距离o第k远的点的距离,不包括o)
看图,当k=3时 d i s t a n c e k ( o ) distance_k(o) distancek(o) = d i s t a n c e ( o , p 3 ) distance(o,p_3) distance(o,p3) 并且满足:- 在集合C中至少有不包括o在内的k个点p∈C{p≠o},满足d{o,p}≤d{o, p 3 p_3 p3}
- 在集合C中至少有不包括o在内的k-1个点p∈C{p≠o},满足d{o,p}<d{o, p 3 p_3 p3}
-
k-distance neighborhood of p: N k ( o ) N_k(o) Nk(o) ----- o的第k距离邻域
就是o的第k距离即以内的所有点,包括第k距离
因此p的第k邻域点的个数 ∣ N k ( p ) ∣ ≥ k |N_k(p)| ≥ k ∣Nk(p)∣≥k
-
distance:可达距离
d i s t a n c e k ( A , B ) = m a x { d i s t a n c e k ( B ) , d ( A , B ) } distance_{k}(A,B) = max\{distance_k(B),d(A,B)\} distancek(A,B)=max{distancek(B),d(A,B)}也就是,点B到点A的第k可达距离,至少是B的第k距离,或者为A、B间的真实距离。
这也意味着,离点B最近的k个点,B到它们的可达距离被认为相等,且都等于 d i s t a n c e k ( B ) distance_k(B) distancek(B)
-
local reachability density:局部可达密度
点A的局部可达密度
l r d ( A ) = 1 ∑ B ∈ N k ( A ) d i s t a n c e k ( A , B ) ∣ N k ( A ) ∣ lrd(A) = \frac{1}{\frac{\sum_{B∈N_k(A)}distance_k(A,B)}{|N_k(A)|}} lrd(A)=∣Nk(A)∣∑B∈Nk(A)distancek(A,B)1这个值的含义可以这样理解,首先这代表一个密度,
密度越高,我们认为越可能属于同一簇,密度越低,越可能是离群点
。如果p和周围邻域点是同一簇,那么可达距离越可能为较小的 d k ( o ) d_k(o) dk(o),导致可达距离之和较小,密度值较高;如果p和周围邻居点较远,那么可达距离可能都会取较大值 d(A,B),导致密度较小,越可能是离群点。
注意:是p的邻域点 N k ( p ) N_k(p) Nk(p)到p的可达距离,不是p到 N k ( p ) N_k(p) Nk(p)的可达距离,一定要弄清楚关系
-
local outlier factor:局部离群因子
L O F k ( A ) = ∑ B ∈ N k ( A ) l r d ( B ) l r d ( A ) ∣ N k ( A ) ∣ = ∑ B ∈ N k ( A ) l r d ( B ) ∣ N k ( A ) ∣ l r d ( A ) LOF_k(A) = \frac{\sum_{B∈N_k(A)}\frac{lrd(B)}{lrd(A)}}{|N_k(A)|} = \frac{\frac{\sum_{B∈N_k(A)}lrd(B)}{|N_k(A)|}}{lrd(A)} LOFk(A)=∣Nk(A)∣∑B∈Nk(A)lrd(A)lrd(B)=lrd(A)∣Nk(A)∣∑B∈Nk(A)lrd(B)
表示点A的邻域点 N k ( A ) N_k(A) Nk(A)的局部可达密度与点A的局部可达密度之比的平均数。又或者说是点A的邻域点 N k ( A ) N_k(A) Nk(A)的局部可达密度的平均数与点A的局部可达密度之比。如果这个比值越接近1,说明p的其邻域点密度差不多,A可能和邻域同属一簇;如果这个比值越小于1,说明A的密度高于其邻域点密度,A为密集点;如果这个比值越大于1,说A的密度小于其邻域点密度,A越可能是异常点。
在这个图中,圈越大,LOF越大,代表着越可能是离群点。
现在概念定义已经介绍完了,现在再回过头来看一下lof的思想,主要是通过比较每个点A和其邻域点的密度来判断该点是否为异常点,如果点A的密度越低,越可能被认定是异常点。至于密度,是通过点之间的距离来计算的,点之间距离越远,密度越低,距离越近,密度越高,完全符合我们的理解。而且,因为lof对密度的是通过点的第k邻域来计算,而不是全局计算,因此得名为“局部”异常因子,