• 异常检测——局部异常因子(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)

        # !/usr/bin/python
        # -*- coding:utf-8 -*-
         
        import numpy as np
        import matplotlib.pyplot as plt
        from sklearn.neighbors import LocalOutlierFactor
        from scipy import stats
         
        # 构造训练样本
        n_samples = 200  #样本总数
        outliers_fraction = 0.25  #异常样本比例
        n_inliers = int((1. - outliers_fraction) * n_samples)
        n_outliers = int(outliers_fraction * n_samples)
         
        rng = np.random.RandomState(42)
        X = 0.3 * rng.randn(n_inliers // 2, 2)
        X_train = np.r_[X + 2, X - 2]   #正常样本
        X_train = np.r_[X_train, np.random.uniform(low=-6, high=6, size=(n_outliers, 2))]  #正常样本加上异常样本
         
        # fit the model
        clf = LocalOutlierFactor(n_neighbors=35, contamination=outliers_fraction)
        y_pred = clf.fit_predict(X_train)
        scores_pred = clf.negative_outlier_factor_
        threshold = stats.scoreatpercentile(scores_pred, 100 * outliers_fraction)  # 根据异常样本比例,得到阈值,用于绘图
         
        # plot the level sets of the decision function
        xx, yy = np.meshgrid(np.linspace(-7, 7, 50), np.linspace(-7, 7, 50))
        Z = clf._decision_function(np.c_[xx.ravel(), yy.ravel()])  # 类似scores_pred的值,值越小越有可能是异常点
        Z = Z.reshape(xx.shape)
         
        plt.title("Local Outlier Factor (LOF)")
        # plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
         
        plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), threshold, 7), cmap=plt.cm.Blues_r)  # 绘制异常点区域,值从最小的到阈值的那部分
        a = plt.contour(xx, yy, Z, levels=[threshold], linewidths=2, colors='red')  # 绘制异常点区域和正常点区域的边界
        plt.contourf(xx, yy, Z, levels=[threshold, Z.max()], colors='palevioletred')  # 绘制正常点区域,值从阈值到最大的那部分
         
        b = plt.scatter(X_train[:-n_outliers, 0], X_train[:-n_outliers, 1], c='white',
                            s=20, edgecolor='k')
        c = plt.scatter(X_train[-n_outliers:, 0], X_train[-n_outliers:, 1], c='black',
                            s=20, edgecolor='k')
        plt.axis('tight')
        plt.xlim((-7, 7))
        plt.ylim((-7, 7))
        plt.legend([a.collections[0], b, c],
                   ['learned decision function', 'true inliers', 'true outliers'],
                   loc="upper left")
        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
    --------------------- 
    原文:https://blog.csdn.net/YE1215172385/article/details/79766906 

  • 相关阅读:
    Python:给你们安排一波VIP音乐,看我是如何不充会员也能下载的
    最详细Python打包exe教程,并修改图标,30秒搞定!
    Python:20行代码爬取高质量帅哥美女视频,让你一次看个够
    【Python爬虫】招聘网站实战合集第一弹:爬取前程无忧
    Python爬虫:爬点大家都喜欢的东西,比如美女!每天保持心情愉悦!
    Python吃喝玩乐:爬取全城按摩门店,看看有没有你想去的!
    明天就是1024了,Python前来报到!爬取全网M子图片!
    周末福利!用Python爬取美团美食信息,吃货们走起来!
    Python小工具:据说这是搜索文件最快的工具!没有之一!一起感受下......
    简单实现一个流程图(箭头流程图)
  • 原文地址:https://www.cnblogs.com/bonelee/p/9848019.html
Copyright © 2020-2023  润新知