午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

數(shù)據(jù)挖掘 | 異常值檢測實例

 kieojk 2016-08-27

小編用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)

 

在上圖中,聚類中心被標(biāo)記為星號,異常值標(biāo)記為'+'

 

其他一些用于異常檢測的R包包括:

extremevalues、outliers包:單變量異常檢測

mvoutlier包:基于穩(wěn)定方法的多元變量異常檢測

(封面圖片就是用此包做出來的,uni.plot函數(shù)檢測每個維度上的異常值)




參考文章:

[1] http://blog.163.com/zzz216@yeah/blog/static/162554684201472303218605/



    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多