为什么需要LOF

 在数据挖掘方面,经常需要在做特征工程和模型训练之前对数据进行清洗,剔除无效数据和异常数据。异常检测也是数据挖掘的一个方向,用于反作弊、伪基站、金融诈骗等领域。

 异常检测方法,针对不同的数据形式,有不同的实现方法。常用的有基于分布的方法,在上、下α分位点之外的值认为是异常值(例如图1),对于属性值常用此类方法。基于距离的方法,适用于二维或高维坐标体系内异常点的判别,例如二维平面坐标或经纬度空间坐标下异常点识别,可用此类方法。
LOF(局部异常因子)算法-异常点/离群点检测
 这次要介绍一下一种基于距离的异常检测算法,局部异常因子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可以实现我们的目标。
LOF(局部异常因子)算法-异常点/离群点检测

概念与公式

  1. d(A,B):两点间的距离

  2. k-distance: d i s t a n c e k ( o ) distance_k(o) distancek(o)----- o的第k距离(也就是距离o第k远的点的距离,不包括o)
    LOF(局部异常因子)算法-异常点/离群点检测
    看图,当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}
  3. 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

  4. 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)

  5. 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)BNk(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)的可达距离,一定要弄清楚关系

  6. 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)BNk(A)lrd(A)lrd(B)=lrd(A)Nk(A)BNk(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越大,代表着越可能是离群点。

现在概念定义已经介绍完了,现在再回过头来看一下lof的思想,主要是通过比较每个点A和其邻域点的密度来判断该点是否为异常点,如果点A的密度越低,越可能被认定是异常点。至于密度,是通过点之间的距离来计算的,点之间距离越远,密度越低,距离越近,密度越高,完全符合我们的理解。而且,因为lof对密度的是通过点的第k邻域来计算,而不是全局计算,因此得名为“局部”异常因子,

算法

  ???? https://github.com/damjankuznar/pylof

相关文章: