【问题标题】:R- Consecutive K-means clustering operations in RR- R中的连续K-means聚类操作
【发布时间】:2015-05-29 06:53:21
【问题描述】:

假设我们有一个 10x5 的数据集,其中包含 10 个葡萄酒样品(行)的 5 个化学测量值(例如,var1、var2、var3、var4、var5)。 我们想使用 k 均值聚类基于化学测量对葡萄酒样品进行聚类。这样做很容易。但是,我想执行连续聚类,首先使用单个化学测量对葡萄酒样品进行聚类,然后使用 var1、var2、var3、var4 和 var5 的所有组合(所有一元、二元、三元、四元和五元组合)。

换句话说,我有兴趣根据列中给出的所有可能的测量组合对葡萄酒样本进行聚类,这将产生总共 31 个聚类结果,例如,基于 (1)var1, (2) var2、(3)var3、(4)var4、(5)var5、(6)var1 和 var2、(7)var1 和 var3、...、(31)var1、var2、var3、var4 和 var5。

如何在 R 中创建这样的循环?

【问题讨论】:

标签: r loops cluster-analysis data-mining k-means


【解决方案1】:

假设你有一个数据集:

set.seed(144)
dat <- matrix(rnorm(100), ncol=5)

现在您可以获得列的所有子集(由逻辑向量表示,说明我们是否应该保留每一列),删除第一个(这将删除我们所有的列)。

(cols <- do.call(expand.grid, rep(list(c(F, T)), ncol(dat)))[-1,])
#     Var1  Var2  Var3  Var4  Var5
# 2   TRUE FALSE FALSE FALSE FALSE
# 3  FALSE  TRUE FALSE FALSE FALSE
# 4   TRUE  TRUE FALSE FALSE FALSE
# ...
# 31 FALSE  TRUE  TRUE  TRUE  TRUE
# 32  TRUE  TRUE  TRUE  TRUE  TRUE

最后一步是对每个列子集运行 k-means 聚类,这是 apply 的简单应用(我假设您的每个模型中都需要 3 个聚类):

mods <- apply(cols, 1, function(x) kmeans(dat[,x], 3))

您可以使用列表索引访问 31 个 k-means 模型中的每一个。例如:

mods[[1]]
# K-means clustering with 3 clusters of sizes 7, 5, 8
# 
# Cluster means:
#         [,1]
# 1 -1.4039782
# 2 -0.4215221
# 3  0.3227336
# 
# Clustering vector:
#  [1] 1 3 2 1 1 3 3 1 3 3 2 3 2 1 3 3 2 1 1 2
# 
# Within cluster sum of squares by cluster:
# [1] 0.4061644 0.1438443 0.7054191
#  (between_SS / total_SS =  89.9 %)
# 
# Available components:
# 
# [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"   
# [7] "size"         "iter"         "ifault"   

【讨论】:

    【解决方案2】:
    # create a dummy matrix
    dummy <- matrix(rnorm(10 * 5), 10, 5)
    
    # create all the combinations of variables
    combos <- lapply(1:5, function(x) t(combn(1:5, x)))    
    
    # loop over the combination sets and fit a k-means with 2 clusters to each
    kms <- lapply(combos, function(x) {
      lapply(1:nrow(x), function(y) {
        kmeans(dummy[,x[y,]], 2)
      })
    })
    
    > sapply(kms, length)
    [1]  5 10 10  5  1
    
    # access the results like so:
    > kms[[1]][[1]]
    K-means clustering with 2 clusters of sizes 3, 7
    ...
    

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 2020-08-27
      • 2018-04-05
      • 2018-02-10
      • 2017-08-18
      • 2019-12-18
      • 2017-07-27
      • 2019-09-15
      • 2015-04-11
      相关资源
      最近更新 更多