R语言之离群点检验(part3)--利用聚类检测离群点
學習筆記
參考文獻:《R語言與數據挖掘》
PS:本篇Blog以用R語言應用為主,原理部分請移步《多元統計分析》學習筆記之聚類分析
利用聚類分析檢測離群點
聚類檢測原理
有一種檢測離群點的方法是聚類。例如,基于DBSCAN密度聚類,如果兩個對象之間是密度可達的,則這兩個對象將被劃分到同一組,因此,那些沒有被劃分到任何一組的對象與其他對象是相互孤立的,這些孤立的對象則被認為是離群點。
啥是密度可達?
如果點α\alphaα的鄰域內包含點的數目不少于MinPts,則α\alphaα是密集點(核心點),而α\alphaα鄰域內所有點從α\alphaα出發都是密度可達的,可將這些點與α\alphaα劃分在同一個簇中。
在這里,我們以k?meansk-meansk?means聚類算法來檢測離群點。使用k?meansk-meansk?means聚類,將數據劃分為k組,每一個觀測點都劃分到與之距離最小的分組,然后計算每個觀測點與組重心的距離,并將距離最大的對象作為離群點。
圖示:
由上圖可知,數據被聚類為了3類,其中我們看組2(G2)的5號觀測點,這個觀測點貌似有一點’不合群’,且在所有的觀測點中,5號觀測點離自己的組重心最遠,所以可以把它看做離群點。
R語言實現
利用R自帶的鳶尾花數據集,并使用k?meansk-meansk?means聚類法檢測離群點。
代碼:
#拿到iris數據集中的數值型數據 iris_test <- iris[, 1:4] #得到聚類結果 result <- kmeans(iris_test, centers = 3) #這行請復制代碼,在電腦中自行領會,不太會表達 center <- result$centers[result$cluster, ] #計算每個觀測點,到其組重心的距離 distances <- sqrt(rowSums(iris_test - center)^2) #對距離進行降序排序,拿到距離最遠的5個觀測點的行號 outpoints <- order(distances, decreasing = T)[1:5] print(iris_test[outpoints, ])#繪圖 plot(iris_test[, c("Sepal.Length", "Sepal.Width")], pch = 'o', col = result$cluster, cex = 0.3) points(result$centers[, c("Sepal.Length", "Sepal.Width")], col = c(1:3), pch = 8, cex = 1)points(iris_test[outpoints, c("Sepal.Length", "Sepal.Width")], pch = '+', col = 4, cex = 1.5)控制臺輸出結果:
> print(iris_test[outpoints, ])Sepal.Length Sepal.Width Petal.Length Petal.Width 61 5.0 2.0 3.5 1.0 94 5.0 2.3 3.3 1.0 58 4.9 2.4 3.3 1.0 99 5.1 2.5 3.0 1.1 118 7.7 3.8 6.7 2.2圖像:
后記:DBSCAN密度聚類筆者已經有1年多沒碰過了,若有錯誤求指出。
總結
以上是生活随笔為你收集整理的R语言之离群点检验(part3)--利用聚类检测离群点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奶块找矿洞技巧(奶萝如何选择)
- 下一篇: R语言之连接mysql数据库