在使用 R 进行 K 均值聚类后,检索最接近每个聚类质心的 100 个样本

Retrieve 100 samples closest to the centroids of each cluster after K means clustering using R

我试图通过首先在 R 中执行 K 均值聚类来减少输入数据大小,然后在每个代表性聚类中采样 50-100 个样本用于下游分类和特征选择。

原始数据集被拆分为 80/20,然后 80% 进入 K 均值训练。我知道输入数据有 2 列标签和 110 列数字变量。从标签栏中,我知道有 7 种不同的药物治疗方法。同时,我测试了 elbow 方法以找到簇数的最佳 K,它大约是 8。所以我选择了 10,以便有更多的数据簇为下游采样。

现在我已经完成了 运行 模型 <- Kmeans(),输出列表让我有点不知所措。由于我只需要缩放要放入 kmeans 函数中的数字变量,输出的集群成员不再具有该处理标签。我可以通过将集群成员附加到原始训练数据 table.

来克服这个问题

那么对于10个质心,我如何找出标签是什么?我做不到

training_set$centroids <- model$centroids

最重要的问题是,我如何找到每个簇的 100 个样本,这些样本最靠近各自的质心?我在 python 中看到了一个 post,但还没有 R 资源。 Output 50 samples closest to each cluster center using scikit-learn.k-means library 有什么指点吗?

首先我们需要一个可重现的数据示例:

set.seed(42)
x <- matrix(runif(150), 50, 3)
kmeans.x <- kmeans(x, 10)

现在您想在原始数据 x 中找到最接近计算并存储为 kmeans.x 的质心的观测值。我们使用包 FNN 中的 get.knnx() 函数。我们将只为 10 个集群中的每一个获取 5 个最接近的观测值。

library(FNN)
y <- get.knnx(x, kmeans.x$centers, 5)
str(y)
# List of 2
#  $ nn.index: int [1:10, 1:5] 42 40 50 22 39 47 11 7 8 16 ...
#  $ nn.dist : num [1:10, 1:5] 0.1237 0.0669 0.1316 0.1194 0.1253 ...
y$nn.index[1, ]
# [1] 42 38  3 22 43
idx1 <- sort(y$nn.index[1, ])
cbind(idx1, x[idx1, ])
#      idx1                          
# [1,]    3 0.28614 0.3984854 0.21657
# [2,]   22 0.13871 0.1404791 0.41064
# [3,]   38 0.20766 0.0899805 0.11372
# [4,]   42 0.43577 0.0002389 0.08026
# [5,]   43 0.03743 0.2085700 0.46407

最近邻居的行索引存储在 nn.index 中,因此对于第一个聚类,5 个最近的观察值是 42、38、3、22、43。