K 均值聚类未找到数据中的所有聚类
K-means clustering doesn't find all clusters in data
我使用的数据集如下图所示。如您所见,您会认为 k 均值聚类分析可以轻松找到这些聚类的中心。
然而,当我 运行 K 均值聚类分析和绘制中心时,我得到了这个。
我只使用基本的 kmeans 代码:
cluster <- kmeans(mydata,90)
cluster$centers
关于 kmeans 的一个鲜为人知的事实是,要获得可靠的结果,您需要 运行 算法重复多次随机初始化。我通常使用 kmeans(, nstart = 1000)
.
理论上,kmeans++
算法不会受到初始化问题的影响,但我经常发现 kmeans
具有许多随机重启的性能优于 kmeans++
。不过,您可能想使用 flexclust
R 包尝试 kmeans++
。
正如我在评论中提到的,使用 hclust()
找到中心可能是一种可行的方法。
set.seed(1)
l <- 1e4
v1 <- sample(1:10, l, replace=TRUE) + rnorm(l, 0, 0.05)
v2 <- sample(1:13, l, replace=TRUE) + rnorm(l, 0, 0.05)
dtf <- data.frame(v1, v2)
par(mar=c(2, 2, 1, 1))
plot(dtf, pch=16, cex=0.2, col="#00000044")
km <- kmeans(dtf, 10*13)
points(km$centers, cex=2, lwd=0.5, col="red")
hc <- hclust(dist(dtf))
hc <- cutree(hc, 10*13)
hcent <- aggregate(dtf, list(hc), mean)[, -1]
hckm <- kmeans(dtf, hcent)
points(hckm$centers, cex=3, lwd=0.5, col="blue")
这个数据集用DBSCAN聚类可能会好很多。
选择小于聚类距离的 epsilon(例如 10),然后 Minpts 应该无关紧要,例如 minpts=4
我使用的数据集如下图所示。如您所见,您会认为 k 均值聚类分析可以轻松找到这些聚类的中心。
然而,当我 运行 K 均值聚类分析和绘制中心时,我得到了这个。
我只使用基本的 kmeans 代码:
cluster <- kmeans(mydata,90)
cluster$centers
关于 kmeans 的一个鲜为人知的事实是,要获得可靠的结果,您需要 运行 算法重复多次随机初始化。我通常使用 kmeans(, nstart = 1000)
.
理论上,kmeans++
算法不会受到初始化问题的影响,但我经常发现 kmeans
具有许多随机重启的性能优于 kmeans++
。不过,您可能想使用 flexclust
R 包尝试 kmeans++
。
正如我在评论中提到的,使用 hclust()
找到中心可能是一种可行的方法。
set.seed(1)
l <- 1e4
v1 <- sample(1:10, l, replace=TRUE) + rnorm(l, 0, 0.05)
v2 <- sample(1:13, l, replace=TRUE) + rnorm(l, 0, 0.05)
dtf <- data.frame(v1, v2)
par(mar=c(2, 2, 1, 1))
plot(dtf, pch=16, cex=0.2, col="#00000044")
km <- kmeans(dtf, 10*13)
points(km$centers, cex=2, lwd=0.5, col="red")
hc <- hclust(dist(dtf))
hc <- cutree(hc, 10*13)
hcent <- aggregate(dtf, list(hc), mean)[, -1]
hckm <- kmeans(dtf, hcent)
points(hckm$centers, cex=3, lwd=0.5, col="blue")
这个数据集用DBSCAN聚类可能会好很多。
选择小于聚类距离的 epsilon(例如 10),然后 Minpts 应该无关紧要,例如 minpts=4