LOF离群因子检测算法及python3实现
转载声明
本文首发于 知乎专栏-数据科学与python小记
原文链接 LOF离群因子检测算法及python3实现 - Suranyi的文章 - 知乎
一、相关背景
1.1 异常检测算法
随着数据挖掘技术的快速发展,人们在关注数据整体趋势的同时,开始越来越关注那些明显偏离数据整体趋势的离群数据点,因为这些数据点往往蕴含着更加重要的信息,而处理这些离群数据要依赖于相应的数据挖掘技术。 离群点挖掘的目的是有效的识别出数据集中的异常数据,并且挖掘出数据集中有意义的潜在信息。出现离群点的原因各有不同,其中主要有以下几种情况:
- 数据来源于异类:如欺诈、入侵、疾病爆发、不同寻常的实验结果等。这类离群点的产生机制偏离正常轨道,往往是被关注的重点
- 数据变量固有的变化:自然、周期发生等反映数据集的分布特征,如气候的突然变化、顾客新型购买模式、基因突变等
- 数据测最或收集误差:主要是系统误差、人为的数据读取偏差、测量设备出现故障或“噪音”干扰
- 随机或人为误差:主要原因是实验平台存在随机机制,同时人为在数据录入等过程中可能出现的误差
离群点检测具有非常强的实际意义,在相应的应用领域有着广泛前景。其中工程应用领域主要有以下几个方面:
- 欺诈检测:信用卡的不正当行为,如信用卡、社会保障的欺诈行为或者是银行卡、电话卡的欺诈使用等
- 工业检测:如计算机网络的非法访问等
- 活动监控:通过实时检测手机活跃度或者是股权市场的可疑交易,从而实现检测移动手机诈骗行为等
- 网络性能:计算机网络性能检测(稳健性分析),检测网络堵塞情况等
- 自然生态应用领域:生态系统失调、异常自然气候的发现等
- 公共服务领域:公共卫生中的异常疾病的爆发、公共安全中的突发事件的发生等
目前,随着离群点检测技术的日渐成熟,在未来的发展中将会应用在更多的行业当中,并且能更好地为人类的决策提供指导作用。
离群点检测的一个目标是从看似杂乱无章的大量数据中挖掘有价值的信息,使这些数据更好地为我们的日常生活所服务。但是现实生活中的数据往往具有成百上千的维度,并且数据量极大,这无疑给目前现有的离群点检测方法带来大难题。传统的离群点检测方法虽然在各自特定的应用领域里表现出很好效果,但在高维大数据集中却不再适用。因此如何把离群点检测方法有效地应用于大数据、高维度数据,是目前离群点检测方法的首要目标之一。
1.2 为什么是异常点检测
分类学习算法在训练时有一个共同的基本假设:不同类别的训练样例数目相当。如果不同类别的训练样例数目稍有差别,通常影响不大,但若差别很大,则会对学习过程造成困扰。 ——周志华《机器学习》
2018 年 Mathorcup 数学建模竞赛 B 题——“品牌手机目标用户的精准营销”中就出现这样的问题。原题中,检测用户数 1万+,购买手机用户500+。若使用分类算法,那么分类器很可能会返回这样的一个算法:“所有用户都不会购买这款手机”,分类的正确率高达96%,但显然没有实际意义,因为它并不能预测出任何的正例。
这类问题称为“类别不平衡”,指不同类别的训练样例数目差别很大的情况(上例中,购买的与没有购买用户数量差别大)。处理这类问题往往采用“欠采样”、“过采样”进行数据处理,但通过这样的方法,可能会损失原始数据中的信息。因此,从离群点的角度出发,将购买行为视为“异常”,进行离群点挖掘。
1.3 离群点挖掘方法
1.4 LOF 算法背景
基于密度的离群点检测方法的关键步骤在于给每个数据点都分配一个离散度,其主要思想是:针对给定的数据集,对其中的任意一个数据点,如果在其局部邻域内的点都很密集,那么认为此数据点为正常数据点,而离群点则是距离正常数据点最近邻的点都比较远的数据点。通常有阈值进行界定距离的远近。在基于密度的离群点检测方法中,最具有代表性的方法是局部离群因子检测方法 (Local Outlier Factor, LOF)。
二、算法简介
在众多的离群点检测方法中,LOF 方法是一种典型的基于密度的高精度离群点检测方法。在 LOF 方法中,通过给每个数据点都分配一个依赖于邻域密度的离群因子 LOF,进而判断该数据点是否为离群点。若 LOF 1, 则该数据点为离群点;若 LOF 接近于 1,则该数据点为正常数据点。
2.1 距离度量尺度
设对于没有相同点的样本集合 ,假设共有
个检测样本,数据维数为
,对于
![\forall X_i=(x_{i1},x_{i2},\cdots,x_{im})\in R\qquad i=1,2,\cdots,n\\](https://i-blog.csdnimg.cn/blog_migrate/870e91e80f7739e7dc3ec2a2673cd5e1.png)
针对数据集 中的任意两个数据点
,定义如下几种常用距离度量方式
2.1.1 Eucild(欧几里得)距离:
![\text{Euclid}(X_i,X_j)=\sqrt{\sum^n_{k=1} (X_{ij}-X_{jk})^2}\tag{1}](https://i-blog.csdnimg.cn/blog_migrate/58b0bb6f34f782ef7a11f4790a9553ef.png)
2.1.2 Hamming(汉明)距离:
![\text{Hamming}(X_i,X_j)=\sum^n_{k=1}|X_{ik}\cap X_{jk}|\tag{2}](https://i-blog.csdnimg.cn/blog_migrate/bc73973802d9276a3283836d8a02a26f.png)
注 汉明距离使用在数据传输差错控制编码里面,用于度量信息不相同的位数。
取 ,易见
与
中有
位数字不相同,因此
与
的汉明距离为
。
对于数据处理,一种技巧是先对连续数据进行分组,化为分类变量(分组变量),对分类变量可以引入汉明距离进行度量。——沃兹基 · 硕德
2.1.3 Mahalanobis(马氏)距离:
设样本集 的协方差矩阵为
,记其逆矩阵为
若
可逆,对
做
分解(奇异值分解),得到:
![\sum=UDV^*\tag{3}](https://i-blog.csdnimg.cn/blog_migrate/36566c6c8b9333a77766825c8e51d1f9.png)
若 不可逆,则使用广义逆矩阵
代替
,对其求彭罗斯广义逆,有:
![\sum\,^+=UD^+V^*\tag{4}](https://i-blog.csdnimg.cn/blog_migrate/c6f4e633c626ee5727ce6cd232d4fe84.png)
则两个数据点 的马氏距离为:
![M_D(X_i,X_j)=\sqrt{(X_i-Y_i)^T\sum\,^{-1}(X_i-Y_i)}\tag{5}](https://i-blog.csdnimg.cn/blog_migrate/2c2140ce57ca4c6a3d9b8a83224c81ad.png)
注 马氏距离表示数据的协方差距离,利用 Cholesky 变换处理不同维度之间的相关性和度量尺度变换的问题,是一种有效计算样本集之间的相似度的方法。
2.1.4 球面距离
球面距离其实是在欧式距离基础上进行转换得到的,并不是一种独特的距离度量方式,在地理信息转换中经常使用,本文对此进行详细介绍。
符号 | 说明 | 符号 | 说明 | 符号 | 说明 |
---|---|---|---|---|---|
![]() |
球体球心 | ![]() |
![]() |
![]() |
|
![]() |
球体球径 | ![]() |
![]() |
![]() |
|
![]() |
待测距离点 | ![]() |
![]() |
![]() |
|
![]() |
![]() |
![]() |
交点 | ![]() |
设 A,B 两点的球面坐标为 。若该球体为地球,则 x,y 分别代表纬度和经度。(注:下文的
为 x 的余角,便于推导所使用的记号)
如图所示,连接,在
和
中计算:
![\begin{split} O_AA=&R_A=R\cdot \sin\varphi_A\\ O_BB=&R_B=R\cdot \sin\varphi_B\\ O_AO_B=&R\cdot\cos\varphi_A+R\cdot\cos\varphi_B \end{split} \tag{6}](https://i-blog.csdnimg.cn/blog_migrate/c9eccfe41cf8f9859419dfac15d2db05.png)
由于 与
是异面直线,
是它们的公垂线,所成角度经度差为
,利用异面直线上两点距离公式:
在 中,由余弦定理:
![\begin{split} \cos\angle AOB&=\frac{OA^2+OB^2-AB^2}{2\cdot OA\cdot OB}\\ &=\sin\varphi_A\sin\varphi_B\cos\psi_{A-B}-\cos\varphi_A\cos\varphi_B \end{split}\tag{8}](https://i-blog.csdnimg.cn/blog_migrate/358ef0afc2927377fc9b46c0320774e0.png)
由于此处的 代表纬度的补角,对其进行转换:
![\begin{split} \cos\angle AOB&=\sin\varphi_A\sin\varphi_B\cos\psi_{A-B}-\cos\varphi_A\cos\varphi_B\\ &=\cos x_A\cos x_B\cos(y_A-y_B)+\sin x_A\sin x_B \end{split}\tag{9}](https://i-blog.csdnimg.cn/blog_migrate/019fa6c09cb62bed8c65d9f3da5ae986.png)
因此,点 A,B 的球面距离为:
![\begin{split} d(A,B)&=\frac{\pi R}{180}\cdot\arccos\angle AOB\\ &=\frac{\pi R}{180}\cdot\arccos(\cos x_A\cos x_B\cos(y_A-y_B)+\sin x_A\sin x_B) \end{split}\tag{10}](https://i-blog.csdnimg.cn/blog_migrate/fbcc37067aab519a5f0228223fbc43af.png)
此外还有 Chebyshev(切比雪夫)距离、Minkowski(闵科夫斯基)距离、绝对值距离、Lance & Williams 距离,具体问题具体分析,选择合适的度量方式。
统一使用 表示点
和点
之间的距离。根据定义,易知交换律成立:
![d(A,B)=d(B,A)\tag{11}](https://i-blog.csdnimg.cn/blog_migrate/73ada22c282ca4e25a0a6ca26d216504.png%3Dd%28B%2CA%29%5Ctag%7B11%7D)
2.2 第
距离
定义 为点
的第
距离,
,满足如下条件
- (1) 在集合中至少存在
个点
,使得
- (2) 在集合中至多存在
个点
,使得
简言之:点 P 是距离 O 最近的第 k 个点
2.3
距离邻域
定义 设 N_{k}(O) 为点 O 的第 k 距离邻域,满足:
![N_{k}(O)=\{P'\in D\text{\ \{O\}}\mid d(O,P')\le d_k(O)\}\tag{12}](https://i-blog.csdnimg.cn/blog_migrate/c9906d97c53a12dee6cb78267d7d7a5d.png)
注 此处的邻域概念与国内高数教材略有不同(具体的点,而非区间)。该集合中包含所有到点 O 距离小于点 O 第 k 邻域距离的点。易知有,如上图,点 O 的第 5 距离邻域为:
![N_5(O)=\{P_1,P_2,P_3,P_4,P_5,P_6\}\tag{13}](https://i-blog.csdnimg.cn/blog_migrate/74b79467fe83a211cfe562957faab9d3.png)
2.4 可达距离
定义 点 P 到点 O 的第 k 可达距离定义为: