R语言——离群点检测应用

离群点检测

数据的离群点检测算法有很多,尤其是在R语言的DDoutlier包中,包含了多种基于距离或密度的离群点检测算法。例如:LOF(局部离群值因子算法)、COF(基于连通性的离群因子算法)、DB(在给定邻居数量后基于距离的离群点检测算法)、KDEOS(基于高斯核的和密度离群点检测算法)、LDF(基于高斯核的局部密度因子算法)等。下面不会将所有的算法都一一介绍,会主要介绍LOFCOF两种离群点检测算法,其他的离群点检测算法的使用方式与它们类似。

LOF离群点检测

局部离群值因子(Local Outlier Factor,LOF)算法,会通过估计每个样本和它的局部邻域的分离程度来获得样本的离群值得分。如果样本的局部密度低,LOF得分会很大,那么可能会被看做是离群值,但该算法不能给出是否为异常值的确切判断。

LOF算法可以使用DDoutlier包中的LOF()函数,下面使用数据(离群点检测数据.csv )来演示如何进行异常值检测,该数据集实际上是鸢尾花数据集,使用主成分分析降维到二维后的数据,一共有两个数据特征,使用二维数据是为了数据方便数据的可视化分析,实际上LOF等离群点检测算法在使用时,没有数据维度上的限制。在程序中,计算出每个点的LOF得分后,通过判断其取值是否大于3来确定是否为异常值,如果大于3则认为其是离群点,然后将可视化的离群点的检测效果。

复制代码
library(DDoutlier)
library(tidyverse)
library(gridExtra)

## 读取数据
outldata <- read.csv("data/chap11/离群点检测数据.csv")
head(outldata)
##      Comp.1     Comp.2
## 1 -2.264703  0.4800266
## 2 -2.080961 -0.6741336
## 3 -2.364229 -0.3419080
## 4 -2.299384 -0.5973945
## 5 -2.389842  0.6468354
## 6 -2.075631  1.4891775


## 以周围k个点判断离群点
lof1 <- LOF(outldata,k = 2)
## 使用散点图可视化出每个点的离群点得分大小
plotdata <- outldata
plotdata$score <- lof1
plotdata$isOutlier <- as.factor(ifelse(lof1 > 3,"是","否"))
ggplot(plotdata,aes(x = Comp.1,y = Comp.2))+
  geom_point(aes(size = score,shape = isOutlier),alpha = 0.8)+
  scale_shape_manual(values=c(16,15))+
  ggtitle("LOF离群点检测")

运行程序可获得可视化图像1。

图1: LOF离群点检测

前面使用LOF得分是否大于3判断样本是否为离群点,具有一定的主观性。从图1中可以发现将一个点认为了是离群点。

下面分析在不同的k值(近邻数量)下,每个样本的LOF得分的大小,并将结果进行可视化,运行下面的程序可获得可视化图像2。

复制代码
## 分析在不同的k值情况下,样本LOF得分的大小情况
ks <- c(2,5,8,11)
plots <- list()
for (ii in 1:length(ks)){
  lof1 <- LOF(outldata,k = ks[ii])
  plotdata <- outldata
  plotdata$score <- lof1-0.4
  plotdata$isOutlier <- as.factor(ifelse(lof1 > 3,"是","否"))
  plots[[ii]] <- ggplot(plotdata,aes(x = Comp.1,y = Comp.2))+
    geom_point(aes(size = score,shape = isOutlier),alpha = 0.8)+
    scale_shape_manual(values=c(16,15))+
    ggtitle(paste("LOF:k =",ks[ii],"离群点数量 =",sum(lof1 > 3)))+
    theme(legend.position = "none")
}
grid.arrange(plots[[1]],plots[[2]],plots[[3]],plots[[4]],nrow = 2)

图2: 近邻数对结果的影响

从图2中可以发现,当k=2时识别出1个离群点,当k=5时识别出3个离群点,当k=8时识别出3个离群点,当k=11时识别出2个离群点。

COF离群点检测

COF异常值检测算法和LOF的思想类似,也会给出一个是异常值可能性的得分,得分越大,对应的样本是异常值的可能性就越大。

下面使用COF算法计算每个样本是否为离群点,使用COF()函数,该函数同样可以使用参数k指定计算时使用的近邻数量,运行下面的程序可获得如图3所示的离群点检测结果。

复制代码
## 以周围k个点判断离群点
cof1 <- COF(outldata,k = 2)
## 使用散点图可视化出每个点的离群点得分大小
plotdata <- outldata
plotdata$score <- cof1
plotdata$isOutlier <- as.factor(ifelse(cof1 > 3,"是","否"))
ggplot(plotdata,aes(x = Comp.1,y = Comp.2))+
  geom_point(aes(size = score,shape = isOutlier),alpha = 0.8)+
  scale_shape_manual(values=c(16,15))+
  ggtitle("COF离群点检测")

图3:COF离群点检测

从图13中可知,以3为COF离群点检测的阈值,可以发现数据中有1个离群点。

数据获取

|---------------------|
| 今天的分享就到这里了,敬请期待下一篇! |

最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!

相关推荐
wudl55661 小时前
Pandas-之数据可视化
信息可视化·数据分析·pandas
Acrelhuang2 小时前
覆盖全场景需求:Acrel-1000 变电站综合自动化系统的技术亮点与应用
大数据·网络·人工智能·笔记·物联网
忙碌5442 小时前
智能应用开发指南:深度学习、大数据与微服务的融合之道
大数据·深度学习·微服务
萤丰信息3 小时前
智慧园区系统:开启园区管理与运营的新时代
java·大数据·人工智能·安全·智慧城市·智慧园区
Q26433650233 小时前
【有源码】基于Hadoop+Spark的起点小说网大数据可视化分析系统-基于Python大数据生态的网络文学数据挖掘与可视化系统
大数据·hadoop·python·信息可视化·数据分析·spark·毕业设计
洞见新研社3 小时前
家庭机器人,从科幻到日常的二十年突围战
大数据·人工智能·机器人
中杯可乐多加冰3 小时前
基于网易CodeWave智能开发平台构建宝可梦图鉴
深度学习·低代码·ai·数据分析·数据采集·无代码·网易codewave征文
筑梦之人5 小时前
Spark-3.5.7文档2 - RDD 编程指南
大数据·分布式·spark
艾莉丝努力练剑6 小时前
【C++:红黑树】深入理解红黑树的平衡之道:从原理、变色、旋转到完整实现代码
大数据·开发语言·c++·人工智能·红黑树
ImproveJin6 小时前
Flink Source源码解析
大数据·flink