对嘈杂的数据或异常值进行聚类

机器算法验证 r 机器学习 聚类
2022-03-04 12:25:57

我有这样的两个变量的嘈杂数据。

x1 <- rep(seq(0,1, 0.1), each = 3000)
set.seed(123)
y1 <- rep (c(0.2, 0.8, 0.3, 0.9, 0.65, 0.35,0.7,0.1,0.25, 0.3, 0.95), each = 3000)
set.seed(1234)
e1 = rnorm(length(x1), 0.07,0.07)
set.seed(1223)
e2 = rnorm(length(x1), 0.07,0.07)
set.seed(1334)
yn <- rnorm(20000, 0.5,0.9)
set.seed(2344)
xn <- rnorm(20000, 0.5,0.9)
y <- c(y1 + e1,yn) 
x <- c(x1 + e2, xn) 
plot(x,y,  xlim=c(0,1.2), ylim = c(0,1.2), pch = ".", col = "gray40") 

仔细观察,我可以直观地看到潜在的 10 个集群。

在此处输入图像描述

然而,整个数据有很多点分布:

plot(x,y,   pch = ".", col = "gray40") 

在此处输入图像描述

我想做10个集群。我尝试了 K-means 聚类分析。

xm1 <- cbind(x,y)
cl1 <- kmeans(xm1, 10)
colrs <- c("red", "green", "blue1", "pink", "green4","tan", 
 "gray40", "yellow", "black", "purple") 
plot(xm1, col = colrs[cl1$cluster], pch = ".", xlim=c(0,1.2), ylim = c(0,1.2))

在此处输入图像描述

plot(xm1, col = colrs[cl1$cluster], pch = ".")

在此处输入图像描述

无论如何(可能是内核 k-means,最近的邻居)可以对这种类型的数据做更多的正义。如果是这样,我该怎么做?

2个回答

由于您的数据似乎由高斯混合组成,请尝试高斯混合建模(又名:EM 聚类)。这应该会在此类数据上产生远优于 k-means 的结果。

如果您的“噪声”是均匀分布的,您还可以在混合模型中添加均匀分布。

如果您的数据不太干净,请考虑使用 DBSCAN、MeanShift、OPTICS、HDBSCAN*、... -基于密度的集群似乎适合此数据。DBSCAN 对噪声也非常宽容(“N”代表噪声)。

我建议你看看这篇文章。作者提出了一种稳健的方法,其中去除了异常值并将其余数据聚类。这就是为什么他们称这种方法为“修剪”。还有一个 R 包tclust但据此它已从 CRAN 中删除。总之,这篇文章值得一读。