【问题标题】:Outlier detection with k-means algorithm使用 k-means 算法检测异常值
【发布时间】:2014-06-24 08:17:14
【问题描述】:

我希望你能帮助我解决我的问题。我正在尝试使用 kmeans 算法检测异常值。首先,我执行算法并选择那些与聚类中心有很大距离的对象作为可能的异常值。我不想使用绝对距离,而是想使用相对距离,即对象到集群中心的绝对距离与集群中所有对象到集群中心的平均距离之比。基于绝对距离的异常值检测代码如下:

# remove species from the data to cluster
iris2 <- iris[,1:4]
kmeans.result <- kmeans(iris2, centers=3)
# cluster centers
kmeans.result$centers
# calculate distances between objects and cluster centers
centers <- kmeans.result$centers[kmeans.result$cluster, ]
distances <- sqrt(rowSums((iris2 - centers)^2))
# pick top 5 largest distances
outliers <- order(distances, decreasing=T)[1:5]
# who are outliers
print(outliers)

但是如何使用相对距离而不是绝对距离来查找异常值?

【问题讨论】:

  • 这个问题似乎是题外话,因为它是关于统计数据

标签: r k-means outliers


【解决方案1】:

您只需要计算每个观测值与其聚类的平均距离。你已经有了这些距离,所以你只需要平均它们。然后剩下的就是简单的索引除法:

# calculate mean distances by cluster:
m <- tapply(distances, kmeans.result$cluster,mean)

# divide each distance by the mean for its cluster:
d <- distances/(m[kmeans.result$cluster])

你的异常值:

> d[order(d, decreasing=TRUE)][1:5]
       2        3        3        1        3 
2.706694 2.485078 2.462511 2.388035 2.354807

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 2012-01-01
    • 2017-03-30
    • 2013-07-03
    • 2010-12-05
    • 2017-04-20
    • 2013-04-22
    • 2011-09-15
    相关资源
    最近更新 更多