кластерные метки и кластерные центры (kmeans в R) - PullRequest
1 голос
/ 17 марта 2012

Я совершенно новичок в R и пытаюсь разобраться с объектом kmeans.В идеале я хотел бы взять список меток кластера для каждой точки в моих данных и заменить метку соответствующим центром.По сути, заканчивая матрицей, где каждая точка данных представлена ​​значением центра кластера, в который она была помещена kmeans.

Есть ли способ сделать это эффективно вместо того, чтобы вручную проходить каждую запись и заменять метку кластера значением центра кластера?

Спасибо!

1 Ответ

3 голосов
/ 17 марта 2012

Это то, что вы после? Расширенный от этот ответ :

    # make some data
    x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2),
               matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))
    colnames(x) <- c("x", "y")
    #
    # do cluster analysis
    (cl <- kmeans(x, 2))
    #
    # put cluster labels with data
    out1 <- data.frame(cbind(x, clusterNum = cl$cluster))
    #
    # organise center coords to be ready for merging
    centers <- data.frame(cbind(data.frame(cl$center[,1]), 
                                data.frame(cl$center[,2]), 
                                clusterNum=rownames(cl$center)))
    #
    # merge cluster center coords with data        
    out2 <- merge(out1, centers, all.x = TRUE) 
    #
    # check output
    out2
    clusterNum            x           y   cl.center...1. cl.center...2.
1            1  0.233161364 -0.04258146     0.01064895     0.01376516
2            1 -0.356284774 -0.59135602     0.01064895     0.01376516
3            1 -0.302272796 -0.24033113     0.01064895     0.01376516
4            1 -0.369299302 -0.24997660     0.01064895     0.01376516
5            1 -0.060454427  0.19711328     0.01064895     0.01376516
...
90           2  0.609833599  0.67729922     1.05184887     1.03445718
91           2  0.943306637  1.09420588     1.05184887     1.03445718
92           2  0.545053826  1.22620571     1.05184887     1.03445718
93           2  0.706921965  1.10326091     1.05184887     1.03445718
94           2  0.837644227  1.07121784     1.05184887     1.03445718
95           2  0.550863085  1.06977250     1.05184887     1.03445718
#
# Success! We have one dataframe that includes: raw data, cluster labels
# and cluster center coords

Я использовал merge, чтобы поместить координаты центра кластера в необработанные данные, но, без сомнения, есть более эффективные способы (например, для которых не требуется реорганизация cl$center).

...