1.基于聚类的异常值检测方法
物以类聚——相似的对象聚合在一起,基于聚类的异常点检测方法有两个共同特点:
(1)先采用特殊的聚类算法处理输入数据而得到聚类,再在聚类的基础上来检测异常。
(2)只需要扫描数据集若干次,效率较高,适用于大规模数据集。
2.检测方法计算步骤
基于聚类的异常点检测方法计算如下:
(1)把所有样本按某个聚类方法进行聚类,假设聚为k类:C₁,C₂…Ck
(2)对于每个对象p,计算该对象到每个类之间的距离d(p,Ci)
(3)计算每个对象p的异常因子得分,公式如下:
(4)计算所有对象的因子异常得分的平均值Ave_OF及标准差Dev_OF。
(5)奇异值标定:若OF(p)≥Ave_OF+β·Dve_OF(1≤β≤2),则为奇异值。通常取β=1或1.285。
3.案例数据
以下为图书馆书籍的案例数据,大小为789*16,部分如下图:
4.TOD异常检测案例代码
此处的TOD函数代码为作者自编的代码,如有需要请在公众号:早星数学建模 后台回复TOD,获得相关代码和案例数据。
4.1最优K的确认
基于聚类的异常检测方法的基础是必须先对样本点进行聚类,然而案例数据中所给样本
点个数较多,且维度高难以直观的判断出K-means聚类的参数:聚类数K的值。因此,本文
依据聚类算法中常用的“肘部法则”确定聚类数K的值。
简而言之,“肘部法则”根据计算不同连续K值时,所有样本点SSE的大小进而以斜率
变化大的点(“手肘”)作为聚类数K,此法则简单有效,在聚类算法中常用。对于SSE的计算有:
同理,在聚类算法中,不同K值对应的SSE为:
在MATLAB中编程实现上述“肘部法则”,SSE随K变化如下:
显然,当K>3后,SSE随K不再显著下降,因此可以确定除了异常点之外的样本点可聚为3类。
4.2代码运行与结果
接下来利用matlab查找案例数据中的异常值,以下为matlab代码:
clear clc A=xlsread('3.3基于聚类异常值检测案例数据.xlsx','Sheet1','C2:R790'); [B,sum,ab_rate]=TOD(A); |
在经过Step.5奇异值标定后,共有42个样本点成为异常点,占5.32%,对应序号如下:
序号 | |||||
8 | 127 | 278 | 450 | 606 | 745 |
13 | 162 | 362 | 453 | 632 | 760 |
86 | 172 | 365 | 455 | 650 | 770 |
88 | 188 | 406 | 563 | 678 | 772 |
94 | 226 | 430 | 566 | 698 | 773 |
100 | 273 | 432 | 577 | 713 | 778 |
117 | 277 | 440 | 603 | 715 | 786 |
本案例每一个异常的对象的每一个属性特征用所有对象的每一个属性特征的众数来替代。此外,异常值处理不仅仅可以用众数替代,还可以用均值和中位数,还可以用插值等方法替代。