基于统计的异常值检测可见上篇文章。以下介绍基于密度的LOF异常值检测:
5.LOF介绍
基于密度的异常值检测方法LOF(Local Outlier Factor,局部离群因子)是一种经典的异常检测算法,它通过计算数据点相对于其局部邻域的密度偏差来识别异常值。
算法概述:全称:Local Outlier Factor;提出者:Markus M. Breunig等人;提出时间:2000年
核心思想:通过衡量每个数据点与其邻近点之间的密度关系来确定离群值。
6.LOF工作原理
LOF算法的工作原理可以概括为以下几个步骤:
(1)计算局部密度:对于每个数据点,计算它与其k个最近邻居之间的局部密度。局部密度表示了一个数据点周围的数据点数量,密度越高表示该点越接近正常区域。
(2)计算可达距离:计算每个数据点与其k个最近邻居之间的可达距离。可达距离是一个数据点与其邻近点之间的距离,考虑了局部密度的影响。
(3)计算局部离群因子(LOF):LOF是一个数据点的局部异常因子,表示该点的局部密度与其邻近点的局部密度之比。LOF越大,表示该点越可能是离群值。
(4)判定离群值:根据计算得到的LOF值,可以根据事先定义的阈值来判定数据点是否为离群值。
7.LOF适用背景
LOF算法在多个领域都有广泛的应用,包括但不限于:
欺诈检测:信用卡、电话卡欺诈使用等。工业检测:计算机网络的非法入侵等。活动监控:实时手机活跃度,实现检测移动手机诈骗行为等。网络性能:计算机网络性能检测等。生态监测:生态系统失调、异常自然气候等的发现等。公共服务:公共卫生中的异常疾病爆发等。
8.LOF代码
作者自编的LOF代码可通过关注 公众号:早星数学建模 后,在公众号后台回复LOF获得。接下来利用matlab代码介绍:
%% 5 基于密度LOF异常值检测 %LOF值可以衡量每个数据点的异常程度 % 清除工作区中的所有变量和命令行窗口 clear all; clc; % 创建随机数据,或者直接导入自己的数据替代data rng('default'); % 固定随机数生成器种子 data = [randn(100,2) * 0.75 + ones(100,2); ... randn(20,2) * 0.5 - ones(20,2)]; % 生成100个正态分布的点,缩放和偏移% 生成20个正态分布的点,缩放和偏移 %此处的data可以不是二维,1-n维都可以 % 绘制数据 figure; scatter(data(:,1), data(:,2), 'filled'); % 绘制二维数据的散点图 title('原始数据'); % 图表标题 xlabel('X'); % X轴标签 ylabel('Y'); % Y轴标签 % 调用LOF异常值检测函数 [isAnomaly, anomalyIndices, bestK] = LOF(data);% 调用作者编写的LOF函数 % 输出最佳的k值 fprintf('最佳的k值是: %d\n', bestK); % 绘制数据和异常点 figure; scatter(data(:,1), data(:,2), 'filled'); % 绘制所有数据点的散点图 hold on; scatter(data(isAnomaly,1), data(isAnomaly,2), 'filled', 'r'); % 用红色标记异常点 title('LOF 异常点检测'); % 图表标题 xlabel('X'); % X轴标签 ylabel('Y'); % Y轴标签 legend('正常点', '异常点'); % 图例 hold off; % 关闭图 |
最终,matlab输出data的异常值位置为1 6 7 50 58 70 75 77 79 96 106 118。异常值检测的散点图如下:
9.LOF优缺点
优点:
适用性广:LOF算法可以应用于各种类型的数据集,并且对于不同密度区域内的异常点具有较好的鲁棒性。
量化异常程度:LOF算法不仅可以判断数据点是否为异常值,还可以给出每个数据点的异常程度,便于进一步的分析和处理。
可视化:LOF算法的结果可以通过可视化的方式呈现,帮助用户更直观地理解数据中的异常模式。
缺点:
选择合适的k值:k值的选择对LOF算法的性能有很大影响,需要根据实际数据集进行调整,在作者提供的LOF代码中可以自动输出最优k,即代码中的bestk。
处理大规模数据集:对于大规模数据集,LOF算法的计算复杂度较高,可能需要采用一些优化策略来提高效率。
解释性:虽然LOF算法可以给出每个数据点的异常程度,但对于异常值的具体原因可能需要进一步的分析和解释。