#LOF算法

本文详细介绍了基于LOF(Local Outlier Factor)算法的离群点检测方法,包括算法原理、参数设置及其实现过程。通过实例展示了如何使用Python的sklearn库计算数据点的LOF值,并通过可视化展示离群点与正常点的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

a.每个数据点,计算它与其他点的距离
b.找到它的K近邻,计算LOF得分

clf=LocalOutlierFactor(n_neighbors=20,algorithm='auto',contamination=0.1,n_jobs=-1,p=2)

参数含义

●n_neighbors=20:即LOF算法中的k的值,检测的邻域点个数超过样本数则使用所有的样本进行检测
●algorithm = 'auto':使用的求解算法,使用默认值即可
●contamination = 0.1:范围为 (0, 0.5),表示样本中的异常点比例,默认为 0.1
● n_jobs = -1:并行任务数,设置为-1表示使用所有CPU进行工作
● p = 2:距离度量函数,默认使用欧式距离。

def localoutlierfactor(data, predict, k):
    from sklearn.neighbors import LocalOutlierFactor
    clf = LocalOutlierFactor(n_neighbors=k + 1, algorithm='auto', contamination=0.1, n_jobs=-1)
    clf.fit(data)
    # 记录 k 邻域距离
    predict['k distances'] = clf.kneighbors(predict)[0].max(axis=1)
    # 记录 LOF 离群因子,做相反数处理
    predict['local outlier factor'] = -clf._decision_function(predict.iloc[:, :-1])
    return predict

def plot_lof(result, method):
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    plt.figure(figsize=(8, 4)).add_subplot(111)
    plt.scatter(result[result['local outlier factor'] > method].index,
                result[result['local outlier factor'] > method]['local outlier factor'], c='red', s=50,
                marker='.', alpha=None,
                label='离群点')
    plt.scatter(result[result['local outlier factor'] <= method].index,
                result[result['local outlier factor'] <= method]['local outlier factor'], c='black', s=50,
                marker='.', alpha=None, label='正常点')
    plt.hlines(method, -2, 2 + max(result.index), linestyles='--')
    plt.xlim(-2, 2 + max(result.index))
    plt.title('LOF局部离群点检测', fontsize=13)
    plt.ylabel('局部离群因子', fontsize=15)
    plt.legend()
    plt.show()

def lof(data, predict=None, k=5, method=1, plot=True):
    import pandas as pd
    # 判断是否传入测试数据,若没有传入则测试数据赋值为训练数据
    try:
        if predict == None:
            predict = data.copy()
    except Exception:
        pass
    predict = pd.DataFrame(predict)
    # 计算 LOF 离群因子
    predict = localoutlierfactor(data, predict, k)
    if plot == True:
        plot_lof(predict, method)
    # 根据阈值划分离群点与正常点
    outliers = predict[predict['local outlier factor'] > method].sort_values(by='local outlier factor')
    inliers = predict[predict['local outlier factor'] <= method].sort_values(by='local outlier factor')
    return outliers, inliers
import numpy as np
import pandas as pd
import xlrd
# 根据文件位置自行修改
posi = pd.read_excel(r'./已结束项目任务数据.xls')
lon = np.array(posi["任务gps经度"][:])  # 经度
lat = np.array(posi["任务gps 纬度"][:])  # 纬度
A = list(zip(lat, lon))  # 按照纬度-经度匹配

# 获取任务密度,取第5邻域,阈值为2(LOF大于2认为是离群值)
outliers1, inliers1 = lof(A, k=5, method = 2)

Alt text

参考链接:
https://www.jianshu.com/p/8c5c0c903f27
https://zhuanlan.zhihu.com/p/28178476
异常检测的几种方法
https://xz.aliyun.com/t/5378

转载于:https://www.cnblogs.com/afanti/p/11009734.html

### LOF算法的原理 局部异常因子(Local Outlier Factor,简称LOF)是一种基于密度的无监督异常检测算法。其核心思想是通过比较每个数据点与其邻域内其他点的局部密度差异来识别异常值。具体来说,LOF算法会计算每个数据点的局部密度,并将其与邻域内其他点的局部密度进行比较,从而确定该点是否为异常值。 在LOF算法中,局部密度是通过k近邻方法来计算的。对于给定的数据点 $ p $,首先找到其最近的 $ k $ 个邻居,然后根据这些邻居的距离来估计该点的局部密度。通常情况下,距离越远,密度越低;距离越近,密度越高。如果某个点的局部密度显著低于其邻居的局部密度,则该点可能被标记为异常点。 LOF值的计算公式如下: $$ \text{LOF}(p) = \frac{\sum_{o \in N_k(p)} \text{lrd}(o)}{\text{lrd}(p) \cdot |N_k(p)|} $$ 其中: - $ N_k(p) $ 表示点 $ p $ 的 $ k $ 个最近邻居; - $ \text{lrd}(p) $ 表示点 $ p $ 的局部可达密度(local reachability density); - $ \text{LOF}(p) $ 是点 $ p $ 的局部异常因子。 当 $ \text{LOF}(p) $ 的值明显大于1时,表示该点是一个异常点;而接近于1的值则表明该点是正常的[^3]。 ### 应用场景 LOF算法因其能够有效处理局部异常的特点,在多个领域得到了广泛应用。以下是一些典型的应用场景: #### 医疗健康 LOF算法可以用于识别疾病的早期征兆、异常的生理指标等。例如,将患者的生理指标数据作为数据集,利用LOF算法识别出与正常生理指标模式不符的指标,从而及时发现疾病的早期征兆[^2]。 #### 网络安全 在网络流量监控中,LOF算法可以用来检测异常行为或入侵活动。通过对网络流量数据进行分析,LOF可以帮助识别出那些与正常流量模式不同的可疑活动,进而提高系统的安全性。 #### 工业监测 在工业生产过程中,传感器会产生大量的实时数据。LOF算法可以应用于这些流数据中,帮助检测设备故障、异常操作或其他潜在问题,确保生产线的稳定运行。 #### 金融风控 在金融行业中,LOF算法可以用于欺诈检测。通过对交易记录进行分析,LOF能够识别出那些不符合常规交易模式的行为,从而帮助金融机构防范欺诈风险。 ### 异常检测的优势与挑战 #### 优势 - **局部敏感性**:与其他全局异常检测算法不同,LOF专注于局部区域内的密度变化,因此更适合发现那些在局部环境中显得异常但整体上并不突出的数据点。 - **无需标签**:作为一种无监督学习方法,LOF不需要预先标记的数据集即可工作,这使得它适用于很多实际应用场景。 - **灵活性**:LOF可以通过调整参数 $ k $ 来适应不同的数据分布和密度特性,具有较高的灵活性。 #### 挑战 - **参数选择**:LOF算法需要确定 $ k $ 值,$ k $ 值的选择对算法的性能有很大影响,目前还没有一种通用的方法来确定最佳的 $ k $ 值[^2]。 - **高维数据处理**:随着数据维度的增加,LOF算法的计算复杂度会急剧增加,因此需要研究更高效的算法来处理高维数据。 - **可解释性**:LOF算法的计算过程比较复杂,其结果的可解释性较差,需要进一步研究更加直观易懂的异常点检测算法[^2]。 ### 示例代码 以下是一个使用Python实现LOF算法的简单示例: ```python from sklearn.neighbors import LocalOutlierFactor import numpy as np # 生成一些随机数据 X = np.random.randn(100, 2) # 添加一个明显的异常点 X = np.vstack([X, [5, 5]]) # 使用LOF算法进行异常检测 lof = LocalOutlierFactor(n_neighbors=5) y_pred = lof.fit_predict(X) # 输出预测结果 print("预测结果:", y_pred) ``` 在这个示例中,我们使用了`scikit-learn`库中的`LocalOutlierFactor`类来进行异常检测。通过设置`n_neighbors=5`,指定了每个点的最近邻居数量。最后,`fit_predict`函数返回了一个数组,其中-1表示异常点,1表示正常点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值