【问题标题】:Initialize kmeans, *vector* initial centroids, R初始化 kmeans,*vector* 初始质心,R
【发布时间】:2015-09-17 16:03:00
【问题描述】:

this post 中有一种方法可以为 R 中的 K-means 算法初始化中心。但是,其中使用的数据是标量(即数字)。

这个问题的一个变体:如果数据有多个维度怎么办。在这种情况下,新中心应该是向量,所以 start 应该是向量的向量......我尝试了类似的东西:

C1<- c(1,2)
C2<- c(4,-5)

拥有我的两个初始中心,然后使用

kmeans(dat, c(C1,C2))

但它没有工作。我也试过cbind() 而不是c()。结果一样...

【问题讨论】:

  • 如果您正确阅读了帖子,数据有多个维度,也就是 2 ...所以问题得到了回答。后面如果要讲初始化方法(帖子里的那个很基础但是“差”,可以改进),这就是另一个话题了。
  • 谢谢!您对数据的处理是正确的。我也试过这个,但没有成功。我认为问题可能来自我的data.frame中的colnames。我运行了 Results
  • 如果您输入数据,则更容易提供建议;)

标签: r k-means


【解决方案1】:
## Your centers
C1 <- c(1, 2)
C2 <- c(4, -5)

## Simulate some data with groups around these centers
library(MASS)
set.seed(0)
dat <- rbind(mvrnorm(100, mu=C1, Sigma = matrix(c(2,3,3,10), 2)),
             mvrnorm(100, mu=C2, Sigma = matrix(c(10,3,3,2), 2)))

clusts <- kmeans(dat, rbind(C1, C2))  # get clusters with your center starting points

## Look at them
plot(dat, col=clusts$cluster)

【讨论】:

    【解决方案2】:

    您将矩阵 start 扩展为具有 cluster 行和 variables 列(维度),其中 cluster 是您的集群数正在尝试识别,variables 是数据集中的变量数。

    这是您链接到的帖子的扩展,将示例扩展为 3 个维度(变量)xyz

    set.seed(1)
    dat <- data.frame(x = rnorm(99, mean = c(-5, 0 , 5)),
                      y = rnorm(99, mean = c(-5, 0, 5)),
                      z = rnorm(99, mean = c(-5, 2, -4)))
    plot(dat)
    

    剧情是:

    现在我们需要为三个集群中的每一个指定集群中心。和以前一样,这是通过矩阵完成的:

    start <- matrix(c(-5, 0, 5, -5, 0, 5, -5, 2, -4), nrow = 3, ncol = 3)
    
    > start
         [,1] [,2] [,3]
    [1,]   -5   -5   -5
    [2,]    0    0    2
    [3,]    5    5   -4
    

    在这里,需要注意的重要一点是集群是成行的。这些列是指定聚类中心的该维度上的坐标。因此,对于集群 1,我们指定质心位于 (-5,-5,-5)

    致电kmeans()

    kmeans(dat, start)
    

    导致它选择非常接近我们初始起点的组(在本例中应该如此):

    > kmeans(dat, start)
    K-means clustering with 3 clusters of sizes 33, 33, 33
    
    Cluster means:
               x           y         z
    1 -4.8371412 -4.98259934 -4.953537
    2  0.2106241  0.07808787  2.073369
    3  4.9708243  4.77465974 -4.047120
    
    Clustering vector:
     [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2
    [39] 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1
    [77] 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
    
    Within cluster sum of squares by cluster:
    [1] 117.78043  77.65203  77.00541
     (between_SS / total_SS =  93.8 %)
    
    Available components:
    
    [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
    [6] "betweenss"    "size"         "iter"         "ifault"
    

    这里值得注意的是集群中心的输出:

    Cluster means:
               x           y         z
    1 -4.8371412 -4.98259934 -4.953537
    2  0.2106241  0.07808787  2.073369
    3  4.9708243  4.77465974 -4.047120
    

    这个布局和矩阵start一模一样。

    您不必直接使用matrix() 构建矩阵,也不必按列指定中心。例如:

    c1 <- c(-5, -5, -5)
    c2 <- c( 0,  0,  2)
    c3 <- c( 5,  5, -4)
    start2 <- rbind(c1, c2, c3)
    
    > start2
       [,1] [,2] [,3]
    c1   -5   -5   -5
    c2    0    0    2
    c3    5    5   -4
    

    或者

    start3 <- matrix(c(-5, -5, -5,
                        0,  0,  2,
                        5,   5, -4), ncol = 3, nrow = 3, byrow = TRUE)
    
    > start3
         [,1] [,2] [,3]
    [1,]   -5   -5   -5
    [2,]    0    0    2
    [3,]    5    5   -4
    

    如果这些对你来说更舒服。

    要记住的关键是变量在列中,集群中心在行中。

    【讨论】:

    • 非常感谢!它终于奏效了,我仍然不确定我的问题是什么,因为我正在输入我的 $3\times 9$ 矩阵来指定三个中心(9 个变量)。
    猜你喜欢
    • 2013-04-29
    • 2016-11-16
    • 2018-05-09
    • 2022-11-30
    • 2013-07-30
    • 2013-06-06
    • 2015-05-22
    • 2017-09-14
    • 2019-05-14
    相关资源
    最近更新 更多