我不会使用 k-means 来发现多变量数据集中的异常值,原因很简单,k-means 算法不是为此目的而构建的:您最终会得到一个解决方案,以最大限度地减少总内 -聚类平方和(因此最大化聚类间 SS,因为总方差是固定的),并且异常值不一定定义它们自己的聚类。考虑 R 中的以下示例:
set.seed(123)
sim.xy <- function(n, mean, sd) cbind(rnorm(n, mean[1], sd[1]),
rnorm(n, mean[2],sd[2]))
# generate three clouds of points, well separated in the 2D plane
xy <- rbind(sim.xy(100, c(0,0), c(.2,.2)),
sim.xy(100, c(2.5,0), c(.4,.2)),
sim.xy(100, c(1.25,.5), c(.3,.2)))
xy[1,] <- c(0,2) # convert 1st obs. to an outlying value
km3 <- kmeans(xy, 3) # ask for three clusters
km4 <- kmeans(xy, 4) # ask for four clusters
从下图中可以看出,离群值永远不会像这样恢复:它将始终属于其他集群之一。
然而,一种可能性是使用两阶段方法,其中以迭代方式移除极值点(此处定义为远离其簇质心的向量),如下文所述:Improving K-Means by Outlier Removal ( Hautamäki 等人)。
这与基因研究中检测和移除表现出基因分型错误的个体或兄弟姐妹/双胞胎个体(或当我们想要识别人口子结构时)的做法有些相似,而我们只想保留无关的个体;在这种情况下,我们使用多维缩放(相当于 PCA,前两个轴为常数)并在前 10 或 20 个轴中的任何一个轴上移除高于或低于 6 SD 的观察值(例如,参见 @ 987654322@,Patterson 等人,PLoS 遗传学 2006 2(12))。
一种常见的替代方法是使用有序的稳健马氏距离,可以根据卡方分布的预期分位数绘制(在 QQ 图中),如下文所述:
R.G.加勒特 (1989)。 The chi-square plot: a tools for multivariate outlier recognition。 地球化学勘探杂志 32(1/3): 319-341.
(在mvoutlier R 包中可用。)