2017-09-20 55 views
0

的离群值数据集的异常值可以通过单连接方法轻松识别。现在我想自动删除异常值。我的想法是删除超过指定距离值的数据。这里是我的代码以mtcars的示例数据:在聚类分析中自动删除计算的凝聚层次聚类数据

library(cluster) 
library(dendextend) 
cluster<-agnes(mtcars,stand=FALSE,method="single") 
dend = as.dendrogram(cluster) 

Plot你可以看到生成的树状图。最后4辆车(“Duster 360”,“Camaro Z28”,“Ford Pantera L”,“Maserati Bora”)被识别为异常值,因此我想删除它们的孔行(数据集mtcars)。我怎样才能自动做到这一点?例如。删除高度超过70的行?我尝试了很多可能性来删除异常值,但它们似乎不适用于我的数据。

非常感谢!

+2

我不认为它是如此简单,你建议。你说:“最后4辆车...被识别为异常值”。我会告诉你,玛莎拉蒂是一个异常值,但你为什么说其他三个是异常值,而不是3个小团? – G5W

+0

也许异常是错误的词。我想删除距离高于70的数据。 – Jules

回答

0

试试这个:

# your code 
library(cluster) 
cluster<-agnes(mtcars,stand=FALSE,method="single") 
dend = as.dendrogram(cluster) 
plot(dend) 

#new code  
hclu <- as.hclust(cluster) # convert to list that cutree() understands 
groupindexes <- cutree(hclu, h = 70) # cut at height 70 - creates 3 groups/branches 
mtcars[groupindexes != 1,] # "outliers" - not in group 1 but in groups 2 and 3 
mtcars[groupindexes == 1,] # all but the 4 "outliers" 

结果1 - 的 “异常值”:

   mpg cyl disp hp drat wt qsec vs am gear carb 
Duster 360  14.3 8 360 245 3.21 3.57 15.84 0 0 3 4 
Camaro Z28  13.3 8 350 245 3.73 3.84 15.41 0 0 3 4 
Ford Pantera L 15.8 8 351 264 4.22 3.17 14.50 0 1 5 4 
Maserati Bora 15.0 8 301 335 3.54 3.57 14.60 0 1 5 8 

结果2:

     mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag  21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710   22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 
(....and ~30 other rows ....) 
+0

非常感谢! – Jules

0

如果您的“规则”是链接距离,那么您基本上重新创建了最近邻居异常值检测,这是数据挖掘中较老的异常值方法之一。

Ramaswamy,Sridhar,Rajeev Rastogi和Kyuseok Shim。 “用于从大型数据集中挖掘异常值的高效算法。” ACM Sigmod记录。卷。 29.No.ACM,2000.

除了与AGNES的单链路需要O(n 3)时间,但索引可以在O(n log n)中做kNN异常值。