当前位置: 首页 > article >正文

python异常检测-局部异常因子(LOF)算法

系列文章目录

Python异常检测- Isolation Forest(孤立森林)
python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS)


文章目录

  • 系列文章目录
  • 前言
  • 一、算法思想
  • 二、LOF计算步骤
  • 三、 python代码实现
  • 总结


前言

Local Outlier Factor(LOF) 文章发表于 SIGMOD 2000,LOF是基于密度的经典算法(Breuning et. al. 2000),通过给每个数据点都分配一个依赖于邻域密度的离群因子 LOF,进而判断该数据点是否为离群点。


一、算法思想

基于密度的异常检测的一个基本假设前提:非离群点对象周围的数据点密度与其邻域周围的数据点的密度类似,而离群点对象数据点周围的密度显著不同于其邻域数据点周围的密度。

LOF是一种基于密度的异常检测算法‌,其核心思想是通过比较一个数据点与其邻域内其他数据点的密度来判定该点是否为异常点。LOF算法通过计算一个数值score来反映一个样本的异常程度,这个数值的大致意思是:一个样本点周围的样本点所处位置的平均密度比上该样本点所在位置的密度。
比值越大于1,则该点所在位置的密度越小于其周围样本所在位置的密度,这个点就越有可能是异常点。
在这里插入图片描述

二、LOF计算步骤

LOF算法不需要对数据的分布做太多假设,能够量化每个数据点的异常程度,并且能够处理高维数据。但是LOF算法的计算复杂度较高,因此我们先要了解一些基本概念
1. k邻近距离
在样本空间中,存在对象o,它与对象p之间的距离记做d(p,o),对象点P附件的点O跟对象点点 P之间的距离满足如下两个条件:
1)在样本空间中,至少存在k个对象q,使得d(p,q)<=d(d,o);
2)在样本空间中,至多存在k-1个对象q,使得d(p,q)<d(p,o)。
则称为点P的 K-邻近距离,记为 dk §,公式如下:

**dk(P)=d(P,O)**

K邻近距离的重点是找到第 K个最近的点,然后用公式计算距离。

  1. k距离领域
    对象p之间距离小于等于k邻近距离的对象集合称为对象p的第k距离领域,其实际含义是以点P为圆心,以k邻近距离dk §为半径画圆,这个圆以内的范围就是k距离领域。

  2. 可达距离
    对于两个点的可达距离的计算,如果距离比较远,那么两点之间的可达距离就是它们的实际距离。如果距离足够近,则可达距离将被K领域距离代替。
    如下图所示,对p1来说,因为p1 在 o 的 k 邻域内(可以看出这里的k=3),所以它们的距离就是 k领域距离的距离。对于p2,很明显它不在o的k邻域内,所以它的可达距离就是实际距离,也就是这两点之间的距离。
    在这里插入图片描述
    4.局部可达密度
    对象p的局部可达密度定义为p的k最近邻点的平均可达距离的倒数,即p的k距离邻域内所有点的可达距离的平均值的导数,距离越大的点,其密度越小。
    在这里插入图片描述
    5.局部异常因子LOF
    LOF算法实际是计算周围邻近的数据点的相对密度,而不是它的绝对局部密度。如果一个数据点跟其他点比较疏远的话,那么显然它的局部可达密度就小。
    在这里插入图片描述

一般而言,LOF算法的实现过程主要包括以下三个步骤:

  • 计算距离‌:对于数据集中的每个点p,计算其与邻域内其他点的距离。

  • 计算密度‌:通过计算每个数据点的k邻域内点的密度来确定该点的局部密度。点之间的距离越远,密度越低;距离越近,密度越高。

  • 计算LOF值‌:通过比较点p与其邻域内点的密度,计算出一个数值score来反映该点的异常程度。如果score大于1,表示该点的密度低于其邻域内的平均密度,则这个点更可能是异常点‌。

三、 python代码实现

在Python中,可以使用scikit-learn库来实现LOF算法。

  1. 安装相应的库文件
pip install scikit-learn
  1. python的代码实现程序
import numpy as np
from sklearn.neighbors import LocalOutlierFactor
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 创建数据集
centers = [[-5, -5], [0, 0], [5, 5]]
X, _ = make_blobs(n_samples=300, centers=centers, cluster_std=0.6)

# 异常值
outliers = np.array([[2, 2], [-2, -2], [4, 4]])

# 合并正常数据与异常值
X_outliers = np.vstack([X, outliers])

# 使用LOF进行异常检测
clf = LocalOutlierFactor(n_neighbors=20, contamination='auto')
y_pred = clf.fit_predict(X_outliers)

# 绘制结果
plt.scatter(X[:, 0], X[:, 1], color='blue', label='Normal data')
plt.scatter(outliers[:, 0], outliers[:, 1], color='red', label='Outliers')
plt.title("Local Outlier Factor")
plt.legend()
plt.show()

# 打印预测结果,-1表示离群点
print(y_pred)

总结

LOF 算法同时考虑了数据集的局部和全局属性。异常值不是按绝对值确定的,而是相对于它们的邻域点密度确定的。当数据集中存在不同密度的不同集群时,LOF表现良好,比较适用于中等高维的数据集。


参考资料
一文读懂异常检测 LOF 算法(Python代码)
异常检测算法之LOF


http://www.kler.cn/news/355752.html

相关文章:

  • Linux下使用c语言获取一个挂载文件夹可用存储空间以及使用率
  • 【已解决】docx4j 结合Thymeleaf 的各种依赖问题(坑)
  • 【Spring声明式事务失效的12种场景测试】
  • Redis 数据类型Bitmaps(位图)
  • ES-入门-javaApi-文档-新增-删除
  • 【芙丽芳丝净润洗面霜和雅漾舒护活泉喷雾
  • AnaTraf | TCP重传的工作原理与优化方法
  • 【数据分享】1901-2023年我国省市县三级逐月最低气温(免费获取/Shp/Excel格式)
  • 详解tcpdump
  • (4) cuda cudnn TensorRT安装及配置
  • Qt(信号槽)
  • 等保测评与网络安全应急响应
  • uni-app 实现好看易用的抽屉效果
  • 实时计算Flink应用场景
  • PMP--必刷题–解题–161-172
  • python编程:常用模块分类整理
  • 打包使用pythn编写的maya插件,使用pyeal打包
  • Karmada核心概念
  • beyond compare 这个授权密钥已被吊销
  • Lucene 倒排索引