我试图通过首先在R中执行K-means聚类来减少输入数据大小,然后为每个代表性聚类采样50-100个样本,用于下游分类和特征选择。
原始数据集被拆分80/20,然后80%进入K均值训练。我知道输入数据有2列标签和110列数值变量。从标签栏中,我知道有7种不同的药物治疗方法。同时,我测试了弯头方法,以找到簇数的最佳K,大约为8。所以我选择了10个,以便有更多的数据集群进行下游采样。
现在我已经运行完模型<-Kmeans((,输出列表让我有点困惑该怎么办。由于我只需要缩放要放入Kmeans函数的数字变量,所以输出集群成员资格不再有处理标签。我可以通过将集群成员添加到原始训练数据表中来克服这一点。
那么,对于这10个质心,我如何找出标签是什么?我不能只做
training_set$centroids <- model$centroids
最重要的问题是,我如何找到每个聚类中与各自质心相邻的100个样本??我在python中看到过一篇帖子,但还没有R资源。使用scikit-earn.k-means库输出最接近每个聚类中心的50个样本有指针吗?
首先,我们需要一个可复制的数据示例:
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。