异常检测的学习笔记并非原创,而是搜索各位大佬的帖子整理而得。如有冒犯,请联系我。
关于异常检测是去寻找异常检测点,异常点不一定是“坏”的样本,在经济学中,经常说到小概率事件,我认为异常点可以认为是小概率事件的研究,我们常常会对异常值进行研究,这也是非常有意义的,如何去确定异常点,怎么去寻找一个标准?
通常我们会用距离衡量各个样本之间的一种关系,此类⽅法不仅适⽤于多维数值数据,在其他许多领域,例如分类数据,⽂本数据,时间序列数据和序列数据等⽅⾯也有⼴泛的应⽤。异常点往往会在局部点出现,本节我们将基于距离和基于密度的方法去寻找异常点。
1. 基于距离的度量
基于距离的异常检测有这样⼀个前提假设,即异常点的 近邻距离要远⼤于正常点。
在基于距离进行异常检测,我们通常使用基于单元的⽅法或者基于索引的方法。
1.1 基于单元的方法
在基于单元格的技术中,数据空间被划分为单元格,单元格的宽度是阈值和数据维数的函数。在给定的单元以及相邻的单元中存在的数据点满⾜某些特性,这些特性可以让数据被更有效的处理。
具体可以参考:异常检测 | Datawhale
1.2 基于索引的⽅法
对于⼀个给定数据集,基于索引的⽅法利⽤多维索引结构(如 树、 树)来搜索每个数据对象 在半径 范围内的相邻点。
该算法在数据集的维数增加时具有较好的扩展性,但是时间复杂度的估算仅考虑了搜索时间,而构造索引的任务本⾝就需要密集复杂的计算量。
2. 基于密度的度量
基于密度的算法主要有局部离群因⼦(LocalOutlierFactor,LOF),以及LOCI、CLOF等基于LOF的改进算法。
但LOF因为要计算距离,运算开销大,不适合大数据,高维。其核心思路是计算每个点在局部区域上(Loca Region)的密度和其领域点的密度来判断异常程度。
2.1 k-距离
对于数据集D中的某⼀个对象o,与其距离最近的k个相邻点的最远距离表⽰为k-distance(p),定义为给定点p和数据集D中对象o之间的距离d(p,o),满⾜:
在集合中⾄少有个点 o,其中,满足;
在集合中最多有个点,其中,满足 。
直观⼀些理解,就是以对象o为中⼼,对数据集D中的所有点到o的距离进⾏排序,距离对象o第k近的点p与o之间的距离就是k-距离。
2.2 k-邻域
由k-距离,我们扩展到⼀个点的集合——到对象o的距离小于等于k-距离的所有点的集合,我们称之为k-邻域:
2.3 可达距离
有了邻域的概念,我们可以按照到对象o的距离远近,将数据集D内的点按照到o的距离分为两类:
若 在对象o的k-邻域内,则可达距离就是给定点p关于对象o的k-距离;
若 在对象o的k-邻域外,则可达距离就是给定点p关于对象o的实际距离。
2.4 局部可达密度
我们可以将“密度”直观地理解为点的聚集程度,就是说,点与点之间距离越短,则密度越⼤。在这⾥,我们使⽤数据集D中给定点p与对象o的k-邻域内所有点的可达距离平均值的倒数(注意,不是导数)来定义局部可达密度。
定义:
由公式可以看出,这⾥是对给定点p进⾏度量,计算其邻域内的所有对象o到给定点p的可达距离平均值。
2.5 局部异常因子
表⽰点p的邻域 内其他点的局部可达密度与点p的局部可达密度之⽐的平均数。如果这个⽐值越接近1,说明o的邻域点密度差不多,o 可能和邻域同属⼀簇;如果这个⽐值小于1,说明o的密度⾼于其邻域点密度,o为密集点;如果这个⽐值⼤于1,说明o的密度小于其邻域点密度,o 可能是异常点。
我们从直观上可以得到⼀个印象,即基于LOF模型的离群点识别在某些情况下,可能⽐基于某种统计学分布规则的识别更加符合实际情况。
3. 基于谱聚类的度量
前面分别介绍了基于距离和密度进行异常检测,我认为可以通过谱聚类的方法对样本进行聚类,从而寻找样本中的异常点。
4.练习
参考链接:https://scikit-learn.org/stable/auto_examples/neighbors/plot_lof_outlier_detection.html?highlight=lof
pyod_lof: https://blog.csdn.net/sweet1194695742/article/details/100150768