异常值检测

LOF算法

LOF(局部异常因子)是一种用于识别基于密度的局部异常值的算法[Breunig等,2000]。使用LOF,将点的局部密度与其邻居的局部密度进行比较。如果前者显着低于后者(LOF值大于1),则该点位于比其邻居更稀疏的区域,这表明它是一个异常值。

包DMwR和dprep中的函数lofactor(data,k)使用LOF算法计算局部异常因子,其中k是计算局部异常因子时使用的邻居数。

计算离群值:

> library(DMwR)
> # remove "Species", which is a categorical column
> iris2 <- iris[,1:4]
> outlier.scores <- lofactor(iris2, k=5)
> plot(density(outlier.scores))

异常值检测_第1张图片
image.png
> # pick top 5 as outliers
> outliers <- order(outlier.scores, decreasing=T)[1:5]
> # who are outliers
> print(outliers)
[1] 42 107 23 110 63

用图解可视化异常值

接下来,我们显示具有前两个主要成分的双标图的异常值。

> n <- nrow(iris2)
> labels <- 1:n
> labels[-outliers] <- "."
> biplot(prcomp(iris2), cex=.8, xlabs=labels)
异常值检测_第2张图片
image.png

我们还可以显示具有如下对的图的异常值,其中异常值用红色标记为“+”。

> pch <- rep(".", n)
> pch[outliers] <- "+"
> col <- rep("black", n)
> col[outliers] <- "red"
> pairs(iris2, pch=pch, col=col)
异常值检测_第3张图片
image.png

LOF分数的并行计算

Package Rlof提供了函数lof(),它是LOF算法的并行实现。它的用法类似于上面的lofactor(),但lof()有两个额外的功能,支持k的多个值和几个距离度量选择。下面是lof()的示例。

> library(Rlof)
> outlier.scores <- lof(iris2, k=5)
> # try with different number of neighbors (k = 5,6,7,8,9 and 10)
> outlier.scores <- lof(iris2, k=c(5:10))

你可能感兴趣的:(异常值检测)