异常检测(三)——Local Outlier Factor(LOF)

在中等高维数据集上执行异常值检测的另一种有效方法是使用局部异常因子(Local Outlier Factor ,LOF)算法。

1、算法思想

LOF通过计算一个数值score来反映一个样本的异常程度。这个数值的大致意思是:一个样本点周围的样本点所处位置的平均密度比上该样本点所在位置的密度。比值越大于1,则该点所在位置的密度越小于其周围样本所在位置的密度,这个点就越有可能是异常点。关于密度等理论概念,详见下面第二部分。

2、LOF的具体理论

关于LOF的理论,可以参考这篇文章,写的非常详细具体!

https://blog.csdn.net/wangyibo0201/article/details/51705966

3、LocalOutlierFactor主要参数和函数介绍

class  sklearn.neighbors. LocalOutlierFactor ( n_neighbors=20 ,  algorithm=’auto’ ,  leaf_size=30 ,  metric=’minkowski’ ,  p=2 ,  metric_params=None ,  contamination=0.1 ,  n_jobs=1 )

1)主要参数

       n_neighbors : 

                 设置k,default=20

       contamination : 

                 设置样本中异常点的比例,default=0.1

2)主要属性:

       negative_outlier_factor_ : numpy array, shape (n_samples,)
                 和LOF相反的值,值越小,越有可能是异常点。(注:上面提到LOF的值越接近1,越可能是正常样本,LOF的值越大于1,则越可能是异常样本)。这里就正好反一下。

3)主要函数:

        fit_predict(X)

                  X : array-like, shape (n_samples, n_features

                  返回一个数组,-1表示异常点,1表示正常点。

4、LOF实例(sklearn)

 
  1. # !/usr/bin/python

  2. # -*- coding:utf-8 -*-

  3.  
  4. import numpy as np

  5. import matplotlib.pyplot as plt

  6. from sklearn.neighbors import LocalOutlierFactor

  7. from scipy import stats

  8.  
  9. # 构造训练样本

  10. n_samples = 200 #样本总数

  11. outliers_fraction = 0.25 #异常样本比例

  12. n_inliers = int((1. - outliers_fraction) * n_samples)

  13. n_outliers = int(outliers_fraction * n_samples)

  14.  
  15. rng = np.random.RandomState(42)

  16. X = 0.3 * rng.randn(n_inliers // 2, 2)

  17. X_train = np.r_[X + 2, X - 2] #正常样本

  18. X_train = np.r_[X_train, np.random.uniform(low=-6, high=6, size=(n_outliers, 2))] #正常样本加上异常样本

  19.  
  20. # fit the model

  21. clf = LocalOutlierFactor(n_neighbors=35, contamination=outliers_fraction)

  22. y_pred = clf.fit_predict(X_train)

  23. scores_pred = clf.negative_outlier_factor_

  24. threshold = stats.scoreatpercentile(scores_pred, 100 * outliers_fraction) # 根据异常样本比例,得到阈值,用于绘图

  25.  
  26. # plot the level sets of the decision function

  27. xx, yy = np.meshgrid(np.linspace(-7, 7, 50), np.linspace(-7, 7, 50))

  28. Z = clf._decision_function(np.c_[xx.ravel(), yy.ravel()]) # 类似scores_pred的值,值越小越有可能是异常点

  29. Z = Z.reshape(xx.shape)

  30.  
  31. plt.title("Local Outlier Factor (LOF)")

  32. # plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)

  33.  
  34. plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), threshold, 7), cmap=plt.cm.Blues_r) # 绘制异常点区域,值从最小的到阈值的那部分

  35. a = plt.contour(xx, yy, Z, levels=[threshold], linewidths=2, colors='red') # 绘制异常点区域和正常点区域的边界

  36. plt.contourf(xx, yy, Z, levels=[threshold, Z.max()], colors='palevioletred') # 绘制正常点区域,值从阈值到最大的那部分

  37.  
  38. b = plt.scatter(X_train[:-n_outliers, 0], X_train[:-n_outliers, 1], c='white',

  39. s=20, edgecolor='k')

  40. c = plt.scatter(X_train[-n_outliers:, 0], X_train[-n_outliers:, 1], c='black',

  41. s=20, edgecolor='k')

  42. plt.axis('tight')

  43. plt.xlim((-7, 7))

  44. plt.ylim((-7, 7))

  45. plt.legend([a.collections[0], b, c],

  46. ['learned decision function', 'true inliers', 'true outliers'],

  47. loc="upper left")

  48. plt.show()

结果:

参考文献:

http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.LocalOutlierFactor.html#sklearn.neighbors.LocalOutlierFactor

http://scikit-learn.org/stable/auto_examples/neighbors/plot_lof.html

http://scikit-learn.org/stable/auto_examples/covariance/plot_outlier_detection.html

https://blog.csdn.net/wangyibo0201/article/details/51705966

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
localoutlierfactor(局部离群因子)是一种常用的异常数据检测方法。其基本思想是判断一个数据点是否为异常点,需要考虑其周围邻居点的密度和分布情况。 对于给定的数据集,localoutlierfactor方法首先计算出每个数据点的局部密度,即该点周围邻居点的密度,通过设定邻居点的个数K来确定。如果一个数据点的K个邻居点很近,说明它处在一个高密度的区域,那么该点的局部密度就会较高;相反,如果这些邻居点离得较远,说明它处在一个低密度的区域,那么该点的局部密度就会较低。 接着,对于每个数据点,计算出其与邻居点相对密度的比例,即局部离群因子(LOF)。如果一个数据点的LOF值大于1,说明该点周围的邻居点的密度比它自身密度更低,即该点是异常点;相反,如果LOF值小于1,则说明该点周围的邻居点的密度比它自身密度更高,即该点是正常点。 通过计算数据集中每个点的LOF值,localoutlierfactor方法能够有效地识别出异常数据点。与传统的基于距离或数值的异常检测方法相比,localoutlierfactor可以更好地适应不同数据分布的情况,并且在处理高维数据和大规模数据时也具有较好的效果。 总之,localoutlierfactor是一种基于密度的异常数据检测方法,通过考虑数据点的局部密度和分布情况,判断数据点是否为异常点,具有较好的鲁棒性和适应性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值