热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python教程分享Python实现异常检测LOF算法的示例代码

大家好,我是东哥。本篇和大家介绍一个经典的异常检测算法:局部离群因子(localoutlierfactor),简称lof算法。背景localoutlierfactor(lof)是基

大家好,我是东哥。

本篇和大家介绍一个经典的异常检测算法:局部离群因子(local outlier factor),简称lof算法。

背景

local outlier factor(lof)是基于密度的经典算法(breuning et. al. 2000), 文章发表于 sigmod 2000, 到目前已经有 3000+ 的引用。

在 lof 之前的异常检测算法大多是基于统计方法的,或者是借用了一些聚类算法用于异常点的识别(比如 ,dbscan,optics)。这些方法都有一些不完美的地方:

  • 基于统计的方法:通常需要假设数据服从特定的概率分布,这个假设往往是不成立的。
  • 聚类方法:通常只能给出 0/1 的判断(即:是不是异常点),不能量化每个数据点的异常程度。

相比较而言,基于密度的lof算法要更简单、直观。它不需要对数据的分布做太多要求,还能量化每个数据点的异常程度(outlierness)。

下面开始正式介绍lof算法。

lof 算法

首先,基于密度的离群点检测方法有一个基本假设:非离群点对象周围的密度与其邻域周围的密度类似,而离群点对象周围的密度显著不同于其邻域周围的密度。

什么意思呢?看下面图片感受下。

Python实现异常检测LOF算法的示例代码

集群 c1 包含了 400 多个点,集群 c2 包含 100 个点。c1 和 c2 都是一类集群点,区别是 c1 位置比较集中,或者说密度比较大。而像 o1、o2点均为异常点,因为基于我们的假设,这两个点周围的密度显著不同于周围点的密度。

lof 就是基于密度来判断异常点的,通过给每个数据点都分配一个依赖于邻域密度的离群因子 lof,进而判断该数据点是否为离群点。 如果lof>=1 ,则该点为离群点,如果lof≈1 ,则该点为正常数据点。

那什么是lof呢?

了解lof前,必须先知道一下几个基本概念,因为lof是基于这几个概念而来的。

1. k邻近距离

在距离数据点p最近的几个点中,第k个最近的点跟点p之间的距离称为点p的 k-邻近距离,记为 k-distance (p),公式如下:

Python实现异常检测LOF算法的示例代码

点o为距离点p最近的第k个点。

Python实现异常检测LOF算法的示例代码

比如上图中,距离点p最近的第4个点是点6。

这里的距离计算可以采用欧式距离、汉明距离、马氏距离等等。比如用欧式距离的计算公式如下:

Python实现异常检测LOF算法的示例代码

这里的重点是找到第k个最近的那个点,然后带公式计算距离。

2. k距离领域

以点p为圆心,以k邻近距离dk(p)为半径画圆,这个圆以内的范围就是k距离领域,公式如下:

Python实现异常检测LOF算法的示例代码

还是上图所示,假设k=4,那么点 1-6 均是邻域范围内的点。

3. 可达距离

这个可达距离大家需要留意点,点p到点o的第k可达距离:

这里计算p到点o的第k可达距离,但是要以点o为中心,取一个最大值,也就是在点p与o的距离、距离点o最近的第k个点距离中取较大的一个,如图下所示。

Python实现异常检测LOF算法的示例代码

p2距离o远,那么两者之间的可达距离就是它们的实际距离。如果距离足够近,如点p1,实际距离将被o的k距离代替。所有p接近o的统计波动d(p,o)可以显著减少,这可以通过参数k来控制,k值越高,同一邻域内的点的可达距离越相似。

4. 局部可达密度

先给出公式。

Python实现异常检测LOF算法的示例代码

数据点p的局部可达密度就是基于p的最近邻的平均可达距离的倒数。距离越大,密度越小。

5. 局部异常因子

根据局部可达密度的定义,如果一个数据点跟其他点比较疏远的话,那么显然它的局部可达密度就小。但lof算法衡量一个数据点的异常程度,并不是看它的绝对局部密度,而是看它跟周围邻近的数据点的相对密度。

这样做的好处是可以允许数据分布不均匀、密度不同的情况。局部异常因子即是用局部相对密度来定义的。数据点p的局部相对密度(局部异常因子)为点p邻域内点的平均局部可达密度跟数据点p的局部可达密度的比值,即:

Python实现异常检测LOF算法的示例代码

lof算法流程

了解了 lof 的定义以后,整个算法也就显而易见了:

  • 对于每个数据点,计算它与其它所有点的距离,并按从近到远排序;
  • 对于每个数据点,找到它的 k-nearest-neighbor,计算 lof 得分;
  • 如果lof值越大,说明越异常,反之如果越小,说明越趋于正常。

Python实现异常检测LOF算法的示例代码

lof优缺点

优点

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

缺点

lof算法中关于局部可达密度的定义其实暗含了一个假设,即:不存在大于等于 k 个重复的点。

当这样的重复点存在的时候,这些点的平均可达距离为零,局部可达密度就变为无穷大,会给计算带来一些麻烦。在实际应用时,为了避免这样的情况出现,可以把 k-distance 改为 k-distinct-distance,不考虑重复的情况。或者,还可以考虑给可达距离都加一个很小的值,避免可达距离等于零。

另外,lof 算法需要计算数据点两两之间的距离,造成整个算法时间复杂度为o(n2)。为了提高算法效率,后续有算法尝试改进。fastlof (goldstein,2012)先将整个数据随机的分成多个子集,然后在每个子集里计算 lof 值。对于那些 lof 异常得分小于等于 1 的,从数据集里剔除,剩下的在下一轮寻找更合适的 nearest-neighbor,并更新 lof 值。

python 实现 lof

有两个库可以计算lof,分别是pyodsklearn,下面分别介绍。

使用pyod自带的方法生成200个训练样本和100个测试样本的数据集。正态样本由多元高斯分布生成,异常样本是使用均匀分布生成的。

训练和测试数据集都有 5 个特征,10% 的行被标记为异常。并且在数据中添加了一些随机噪声,让完美分离正常点和异常点变得稍微困难一些。

from pyod.utils.data import generate_data  import numpy as np  x_train, y_train, x_test, y_test =           generate_data(n_train=200,                        n_test=100,                        n_features=5,                        cOntamination=0.1,                        random_state=3)   x_train = x_train * np.random.uniform(0, 1, size=x_train.shape)  x_test = x_test * np.random.uniform(0,1, size=x_test.shape)

pyod

下面将训练数据拟合了 lof 模型并将其应用于合成测试数据。

在 pyod 中,有两个关键方法:decision_function 和 predict

  • decision_function:返回每一行的异常分数
  • predict:返回一个由 0 和 1 组成的数组,指示每一行被预测为正常 (0) 还是异常值 (1)
from pyod.models.lof import lof  clf_name = 'lof'  clf = lof()  clf.fit(x_train)    test_scores = clf.decision_function(x_test)    roc = round(roc_auc_score(y_test, test_scores), ndigits=4)  prn = round(precision_n_scores(y_test, test_scores), ndigits=4)    print(f'{clf_name} roc:{roc}, precision @ rank n:{prn}')  >> lof roc:0.9656, precision @ rank n:0.8  

可以通过 lof 模型方法查看 lof 分数的分布。在下图中看到正常数据(蓝色)的分数聚集在 1.0 左右。离群数据点(橙色)的得分均大于 1.0,一般高于正常数据。

Python实现异常检测LOF算法的示例代码

sklearn

scikit-learn中实现 lof 进行异常检测时,有两种模式选择:异常检测模式 (novelty=false) 和 novelty检测模式 (novelty=true)

在异常检测模式下,只有fit_predict生成离群点预测的方法可用。可以使用negative_outlier_factor_属性检索训练数据的异常值分数,但无法为未见过的数据生成分数。模型会根据contamination参数(默认值为 0.1)自动选择异常值的阈值。

import matplotlib.pyplot as plt    detector = lof()  scores = detector.fit(x_train).decision_function(x_test)    sns.distplot(scores[y_test==0], label="inlier scores")  sns.distplot(scores[y_test==1], label="outlier scores").set_title("distribution of outlier scores from lof detector")  plt.legend()  plt.xlabel("outlier score")  

在novelty检测模式下,只有decision_function用于生成异常值可用。fit_predict方法不可用,但predict方法可用于生成异常值预测。

clf = localoutlierfactor(novelty=true)  clf = clf.fit(x_train)  test_scores = clf.decision_function(x_test)    test_scores = -1*test_scores    roc = round(roc_auc_score(y_test, test_scores), ndigits=4)  prn = round(precision_n_scores(y_test, test_scores), ndigits=4)    print(f'{clf_name} roc:{roc}, precision @ rank n:{prn}')  

该模式下模型的异常值分数被反转,异常值的分数低于正常值。

Python实现异常检测LOF算法的示例代码

以上就是python实现异常检测lof算法的示例代码的详细内容,更多关于python lof算法的资料请关注<编程笔记>其它相关文章!

需要了解更多python教程分享Python实现异常检测LOF算法的示例代码,都可以关注python教程分享栏目&#8212;编程笔记


推荐阅读
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • Python 可视化 | Seaborn5 分钟入门 (六)——heatmap 热力图
    微信公众号:「Python读财」如有问题或建议,请公众号留言Seaborn是基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。Seabo ... [详细]
  • Python3+Appium安装使用教程
    一、安装我们知道selenium是桌面浏览器自动化操作工具(WebBrowserAutomation)appium是继承selenium自动化思想旨在使手机app操作也能自动化的工具(Mo ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
author-avatar
AU_123_126_218
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有