>

현재 그룹화 된 데이터에서 클러스터의 중심을 찾으려고합니다. 샘플 데이터 세트 및 문제점 정의를 사용하여 kmeans 를 작성할 수 있습니다.  각 그룹과 함께 클러스터. 그러나 주어진 그룹에 대해 클러스터의 각 중심을 처리 할 때 그룹을 얻는 방법을 모르겠습니다. https://rdrr.io/cran/broom/man/kmeans_tidiers.html

샘플 데이터는 보낸 사람 (add gr 를 약간 수정 함)  기둥) 샘플 데이터

library(dplyr)
library(broom)
library(ggplot2)
set.seed(2015)
sizes_1 <- c(20, 100, 500)
sizes_2 <- c(10, 50, 100)
centers_1 <- data_frame(x = c(1, 4, 6), 
                        y = c(5, 0, 6), 
                        n = sizes_1,
                        cluster = factor(1:3))
centers_2 <- data_frame(x = c(1, 4, 6), 
                        y = c(5, 0, 6), 
                        n = sizes_2,
                        cluster = factor(1:3))
points1 <- centers_1 %>% 
    group_by(cluster) %>%
    do(data_frame(x = rnorm(.$n, .$x), 
                  y = rnorm(.$n, .$y), 
                  gr="1"))
points2 <- centers_2 %>% 
    group_by(cluster) %>%
    do(data_frame(x = rnorm(.$n, .$x), 
                  y = rnorm(.$n, .$y), 
                  gr="2"))
combined_points <- rbind(points1, points2)
> combined_points
# A tibble: 780 x 4
# Groups:   cluster [3]
   cluster           x        y    gr
    <fctr>       <dbl>    <dbl> <chr>
 1       1  3.66473833 4.285771     1
 2       1  0.51540619 5.565826     1
 3       1  0.11556319 5.592178     1
 4       1  1.60513712 5.360013     1
 5       1  2.18001557 4.955883     1
 6       1  1.53998887 4.530316     1
 7       1 -1.44165622 4.561338     1
 8       1  2.35076259 5.408538     1
 9       1 -0.03060973 4.980363     1
10       1  2.22165205 5.125556     1
# ... with 770 more rows
ggplot(combined_points, aes(x, y)) +
    facet_wrap(~gr) +
    geom_point(aes(color = cluster))

OK 여기까지 모든 것이 훌륭합니다. 각 그룹에서 각 클러스터 센터를 추출하려는 경우

clust <- combined_points %>% 
    group_by(gr) %>% 
    dplyr::select(x, y) %>% 
    kmeans(3)
> clust
K-means clustering with 3 clusters of sizes 594, 150, 36
Cluster means:
        gr        x         y
1 1.166667 6.080832 6.0074885
2 1.333333 4.055645 0.0654158
3 1.305556 1.507862 5.2417670

우리가 gr 를 볼 수 있듯이  번호가 변경되었는데이 센터가 어떤 그룹에 속하는지 모르겠습니다.

tidy 를보기 위해 한 걸음 앞으로 나아갈 때   clust 의 형식

> tidy(clust)
        x1       x2        x3 size  withinss cluster
1 1.166667 6.080832 6.0074885  594 1095.3047       1
2 1.333333 4.055645 0.0654158  150  312.4182       2
3 1.305556 1.507862 5.2417670   36  115.2484       3

아직도 gr 2 를 볼 수 없습니다  센터 정보.

문제가 매우 명확하게 설명 되었기를 바랍니다. 빠진 부분이 있으면 알려주세요! 미리 감사드립니다!

  • 답변 # 1

    kmeans  dplyr 그룹화를 이해하지 못하므로 각 그룹 내에서 세 개의 전체 센터를 찾는 것입니다. 이 시점에서 선호되는 관용구는 입력 데이터의 목록 열입니다 (예 :

    library(tidyverse)
    points_and_models <- combined_points %>% 
        ungroup() %>% select(-cluster) %>%    # cleanup, remove cluster name so data will collapse
        nest(x, y) %>%     # collapse input data into list column
        mutate(model = map(data, kmeans, 3),    # iterate model over list column of input data
               centers = map(model, broom::tidy))    # extract data from models
    points_and_models
    #> # A tibble: 2 x 4
    #>   gr    data               model        centers             
    #>   <chr> <list>             <list>       <list>              
    #> 1 1     <tibble [620 × 2]> <S3: kmeans> <data.frame [3 × 5]>
    #> 2 2     <tibble [160 × 2]> <S3: kmeans> <data.frame [3 × 5]>
    points_and_models %>% unnest(centers)
    #> # A tibble: 6 x 6
    #>   gr       x1     x2  size withinss cluster
    #>   <chr> <dbl>  <dbl> <int>    <dbl> <fct>  
    #> 1 1      4.29  5.71    158    441.  1      
    #> 2 1      3.79  0.121   102    213.  2      
    #> 3 1      6.39  6.06    360    534.  3      
    #> 4 2      5.94  5.88    100    194.  1      
    #> 5 2      4.01 -0.127    50     97.4 2      
    #> 6 2      1.07  4.57     10     15.7 3
    
    

    와이즈 비즈  열은 입력 데이터가 아니라 모델 결과에서 나온 것입니다.

    cluster 로도 같은 일을 할 수 있습니다 예 :

    do
    
    

    하지만 combined_points %>% group_by(gr) %>% do(model = kmeans(.[c('x', 'y')], 3)) %>% ungroup() %>% group_by(gr) %>% do(map_df(.$model, broom::tidy)) %>% ungroup()  그룹화는이 시점에서 소프트 더 이상 사용되지 않으며, 명시 적으로 do 의 필요성으로 볼 수 있듯이 코드가 약간 멍청합니다.  너무 많아요.

    ungroup

관련 자료

  • 이전 homebrew의 openSSL을 사용하여 macOS에서 Python 362를 어떻게 컴파일 할 수 있습니까?
  • 다음 java - 익명 스캔 업로드를 통한 SonarQube Force 인증