K-Medoids 真的比 K-Means 更擅长处理异常值吗?(举例说明相反)

Yan*_* Li 5 partitioning r cluster-analysis k-means

K-MedoidsK-Means是两种流行的分区聚类方法。我的研究表明,当存在异常值时,K-Medoids 更擅长对数据进行聚类(来源)。这是因为它选择数据点作为聚类中心(并使用曼哈顿距离),而 K-Means 选择任何使平方和最小的中心,因此更容易受到异常值的影响。

这是有道理的,但是当我使用这些方法对虚构数据进行简单测试时,并不表明使用 Medoids 更适合处理异常值,事实上有时更糟。我的问题是:在下面的测试中我哪里出错了?也许我对这些方法有一些根本性的误解。

演示:(参见此处的图片)首先,一些虚构的数据(名为“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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

它与包“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
Run Code Online (Sandbox Code Playgroud)

制作散点图时,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)
Run Code Online (Sandbox Code Playgroud)

请参阅链接中的*图 2*

现在添加了一个异常值:

comp[21,1] <- 3
comp[21,2] <- 7.5
Run Code Online (Sandbox Code Playgroud)

该异常值将蓝色簇的中心移至图表左侧。

因此,当对新数据使用 K-Medoids 时,蓝色簇的最右边的点被断开并加入红色簇。

请参阅链接中的*图 3*

有趣的是,K-means 实际上偶尔会根据随机初始聚类中心(您可能需要运行多次才能获得正确的聚类)使用新数据生成更好(更直观)的聚类,而 K-Medoids 总是生成错误的聚类。

请参阅链接中的*图 4*

从这个例子中可以看出,K-Means 实际上比 K-Medoids 更擅长处理异常值(相同的数据、相同的包等)。我在测试中是否做错了什么或者误解了这些方法的工作原理?