【问题标题】:Retrieve 100 samples closest to the centroids of each cluster after K means clustering using R在K意味着使用R进行聚类后,检索最接近每个聚类质心的100个样本
【发布时间】:2021-02-14 10:19:11
【问题描述】:

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

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

现在我已经完成了模型的运行

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

training_set$centroids <- model$centroids

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

【问题讨论】:

    标签: r k-means centroid subsampling


    【解决方案1】:

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

    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。

    【讨论】:

    • 这太棒了!!!!!!!!!!!!!!!正是我想要的结果。这太甜了!
    • 所以我也正确假设在 y
    • 或者我只是将不应该那样做的东西拼凑在一起@dcarlson
    • 最后,抱歉。在 cbind(idx1, x[idx1, ]) 中,因为 x 数据实际上只是原始数据的数字部分,例如 x
    • 是的,您可以输入整个数据集,因为我没有将搜索限制在实际分类的观察中。是的,您可以使用不同的矩阵/数据框,只要它以相同的顺序具有相同的观察值。
    猜你喜欢
    • 2020-08-17
    • 2021-11-08
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2018-07-02
    • 2018-01-22
    • 2012-09-28
    • 2017-08-28
    相关资源
    最近更新 更多