K-中心点 and K-Means是两种流行的分区聚类方法。我的研究表明,当存在异常值时,K-Medoids 更擅长对数据进行聚类(source https://stackoverflow.com/questions/21619794/what-makes-the-distance-measure-in-k-medoid-better-than-k-means)。这是因为它选择数据点作为聚类中心(并使用曼哈顿距离),而 K-Means 选择任何使平方和最小的中心,因此更容易受到异常值的影响。
这是有道理的,但是当我使用这些方法对虚构数据进行简单测试时,并不表明使用 Medoids 可以更好地处理异常值,事实上有时确实如此worse。我的问题是:在下面的测试中我哪里出错了?也许我对这些方法有一些根本性的误解。
演示:(参见here https://i.stack.imgur.com/mup4r.jpg用于图片)
首先,一些虚构的数据(名为“comp”)构成了 3 个明显的集群
x <- c(2, 3, 2.4, 1.9, 1.6, 2.3, 1.8, 5, 6, 5, 5.8, 6.1, 5.5, 7.2, 7.5, 8, 7.2, 7.8, 7.3, 6.4)
y <- c(3, 2, 3.1, 2.6, 2.7, 2.9, 2.5, 7, 7, 6.5, 6.4, 6.9, 6.5, 7.5, 7.25, 7, 7.8, 7.5, 8.1, 7)
data.frame(x,y) -> comp
library(ggplot2)
ggplot(comp, aes(x, y)) + geom_point(alpha=.5, size=3, pch = 16)
它与包“vegclust”聚集在一起,它可以执行 K-Means 和 K-Medoids。
library(vegclust)
k <- vegclust(x=comp, mobileCenters=3, method="KM", nstart=100, iter.max=1000) #K-Means
k <- vegclust(x=comp, mobileCenters=3, method="KMdd", nstart=100, iter.max=1000) #K-Medoids
制作散点图时,K-Means 和 K-Medoids 都会选取 3 个明显的簇。
color <- k$memb[,1]+k$memb[,2]*2+k$memb[,3]*3 # Making the different clusters have different colors
# K-Means scatterplot
ggplot(comp, aes(x, y)) + geom_point(alpha=.5, color=color, pch = 16, size=3)
# K-Medoids scatterplot
ggplot(comp, aes(x, y)) + geom_point(alpha=.5, color=color, size=3, pch = 16)
现在添加了一个异常值:
comp[21,1] <- 3
comp[21,2] <- 7.5
该异常值将蓝色簇的中心移至图表左侧。
因此,当对新数据使用 K-Medoids 时,蓝色簇的最右边的点被断开并加入红色簇。
有趣的是,K-means 实际上偶尔会根据随机初始聚类中心(您可能需要运行多次才能获得正确的聚类)使用新数据生成更好(更直观)的聚类,而 K-Medoids 总是生成错误的聚类。
从这个例子中可以看出,K-Means 实际上比 K-Medoids 更擅长处理异常值(相同的数据、相同的包等)。我在测试中是否做错了什么或者误解了这些方法的工作原理?