我正在 R 中的factoextra 包中使用 kmeans() 函数。一切都运行良好 - 我有数据的集群,但我正在寻找一种方法来仅提取与数据点一定距离内的数据点每个簇的质心。理想情况下,我正在寻找一种方法来对最近 80% 的点进行子集化,并忽略距离质心更远的点。
是否有一种简单的方法可以在 kmeans() 函数或factoextra 包中实现此目的?或者这需要更复杂的方法?
我还没有找到似乎可以完成这项工作的参数。也许我在我眼皮子底下错过了一些东西?到目前为止,我正在使用这个简单的代码:
library(factoextra)
km.res<-kmeans(data, 4, nstart=10)
fviz_cluster(km.res, data, ellipse.type="norm", geom="point")
谢谢!
使用
kmeans
,选取簇数 ncl,中心为 km$centers
。通过将条目总数除以簇数来获取 80% 的最近点。
情节
plot(df, pch=19, lwd=2)
apply(km$centers, 1, \(x)
points(head(df[order(sqrt((x["x"] - df[,1])^2 + (x["y"] - df[,2])^2)),], pck),
col="green2", pch=20))
points(km$centers, col="red", pch=19, lwd=3)
set.seed(1)
df <- data.frame(x = c(rnorm(100, 4, 1), rnorm(100, 9, 1)),
y = c(rnorm(100, 4, 1), rnorm(100, 9, 1)))
ncl <- 2
km <- kmeans(df, ncl)
pck <- (nrow(df) / ncl) * 0.8