小編用R語言結(jié)合實例,介紹異常檢測的方法: 單變量異常檢測 本部分展示了一個單變量異常檢測的例子,并且演示了如何將這種方法應(yīng)用在多元數(shù)據(jù)上。在該例中,單變量異常檢測通過boxplot.stats()函數(shù)實現(xiàn),并且返回產(chǎn)生箱線圖的統(tǒng)計量。在返回的結(jié)果中,有一個部分是out,它給出了異常值的列表,即它列出了位于極值之外的胡須。參數(shù)coef可以控制胡須延伸到箱線圖外的遠近。在R中,運行?boxplot.stats可獲取更詳細的信息。例子如下: > set.seed(521) > x = rnorm(100) > x[10] = 5 > x[20] = 6 > summary(x) > outliers = boxplot.stats(x)$out > outliers [1] 5.000000 6.000000 -3.338937 > boxplot(x) > for(i in outliers) points(i,col='red', pch='+', cex=2.5) 如上的單變量異常檢測,通過簡單搭配的方式可以用來發(fā)現(xiàn)多元數(shù)據(jù)中的異常值。在下例中,我們首先產(chǎn)生一個數(shù)據(jù)框df,它有兩列x和y。之后,異常值分別從x和y檢測出來。然后,我們獲取兩列都是異常值的數(shù)據(jù)作為異常數(shù)據(jù)。 > y = rnorm(100) > df = data.frame(x, y) > a = which(df$x %in%boxplot.stats(df$x)$out) > a > b = which(df$y %in%boxplot.stats(df$y)$out) > b > outliers = intersect(a, b) > plot(df) > points(df[outliers,], col='red',pch='+', cex=2.5) 類似的,我們也可以將x或y為異常值的數(shù)據(jù)標(biāo)記為異常值。 > outliers = union(a, b) > plot(df) > points(df[outliers,], col='blue',pch='+', cex=2.5) 當(dāng)有三個以上的變量時,最終的異常值需要考慮單變量異常檢測結(jié)果的多數(shù)表決。當(dāng)選擇最佳方式在真實應(yīng)用中進行搭配時,需要涉及領(lǐng)域知識。
LOF異常檢測 LOF(local outlier factor,局部異常因子)是用于識別基于密度的局部異常值的算法。使用LOF,一個點的局部密度會與它的鄰居進行比較。如果前者明顯低于后者(有一個大于1 的LOF值),該點位于一個稀疏區(qū)域,對于它的鄰居而言,這就表明,該點是一個異常值。LOF的缺點就是它只對數(shù)值數(shù)據(jù)有效。 lofactor()函數(shù)使用LOF算法計算局部異常因子,并且它在DMwR和dprep包中是可用的。下面將介紹一個使用LOF進行異常檢測的例子,k是用于計算局部異常因子的鄰居數(shù)量。下圖呈現(xiàn)了一個異常值得分的密度圖。 > library(DMwR) > iris2 = iris[, 1:4] > outlier_scores = lofactor(iris2, k=5) > plot(density(outlier_scores)) # 將前5個作為異常值 > outliers = order(outlier_scores,decreasing=T)[1:5] > outliers > iris2[outliers,] Sepal.Length Sepal.Width Petal.Length Petal.Width 42 4.5 2.3 1.3 0.3 107 4.9 2.5 4.5 1.7 23 4.6 3.6 1.0 0.2 110 7.2 3.6 6.1 2.5 63 6.0 2.2 4.0 1.0 接著,我們結(jié)合前兩個主成份的雙標(biāo)圖呈現(xiàn)異常值。 > n = nrow(iris2) > labels = 1:n > labels[-outliers] = '.' > biplot(prcomp(iris2), cex=0.8,xlabs=labels) 在如上代碼中,prcomp()執(zhí)行了一個主成分分析,并且biplot()使用前兩個主成分畫出了這些數(shù)據(jù)。在上圖中,x和y軸分別代表第一和第二個主成份,箭頭表示了變量,5個異常值用它們的行號標(biāo)記出來了。
聚類異常檢測 通過把數(shù)據(jù)聚成類,將那些不屬于任務(wù)一類的數(shù)據(jù)作為異常值。比如,使用基于密度的聚類DBSCAN,如果對象在稠密區(qū)域緊密相連,它們將被分組到一類。因此,那些不會被分到任何一類的對象就是異常值。 我們也可以使用k-means算法來檢測異常。使用k-means算法,數(shù)據(jù)被分成k組,通過把它們分配到最近的聚類中心。然后,我們能夠計算每個對象到聚類中心的距離(或相似性),并且選擇最大的距離作為異常值。 如下是一個基于k-means算法在iris數(shù)據(jù)上實現(xiàn)在異常檢測。 # 去掉species列 > iris2 = iris[, 1:4] > kmeans_result = kmeans(iris2,centers=3) > kmeans_result$centers > kmeans_result$cluster > centers =kmeans_result$centers[kmeans_result$cluster,] > distances =sqrt(rowSums((iris2-centers)^2)) # 取前5個作為異常值 > outliers = order(distances,decreasing=T)[1:5] > outliers > iris2[outliers,] > plot(iris2[,c('Sepal.Length', 'Sepal.Width')], pch='o',col=kmeans_result$cluster, cex=0.5) > points(kmeans_result$centers[,c('Sepal.Length','Sepal.Width')], col=1:3, pch=8, cex=1.5) > points(iris2[outliers,c('Sepal.Length','Sepal.Width')], col=4, pch='+', cex=1.5)
其他一些用于異常檢測的R包包括: extremevalues、outliers包:單變量異常檢測 mvoutlier包:基于穩(wěn)定方法的多元變量異常檢測 (封面圖片就是用此包做出來的,uni.plot函數(shù)檢測每個維度上的異常值) 參考文章: [1] http://blog.163.com/zzz216@yeah/blog/static/162554684201472303218605/
|
|
來自: kieojk > 《數(shù)據(jù)挖掘》