##acl +All:read #format wiki #language ko #pragma description 기초의학통계학 및 실험; = Clustering = == Classification vs. Clustering == || 분류 || Learning 기법 || 요약 || || Classification || Supervised || 기분류된 데이타로 회귀 모델을 만들어 분류 || || Clustering || Un-supervised || 데이타 모양(거리)로 unbiased 분류 시도 || === Classification === {{https://cdn-images-1.medium.com/max/2000/1*ASYpFfDh7XnreU-ygqXonw.png||width=500px}} * Linear Regression을 응용한 logistic regression, naive bayes, support vector machines, artificial neural networks, random forests 등을 이용 * 기존 데이타(training dataset)으로 학습한 후 그 regression 함수로 새로운 데이타(test dataset)을 분류 === Clustering === {{https://upload.wikimedia.org/wikipedia/commons/1/16/Swiss_kmeans.svg||width=500px}} * training dataset이 없거나 구하기가 어려운 경우, 데이타 자체로 분류 * 한줄 요약: 거리가 가까운 데이터끼리 같은 그룹으로 분류한다. * 거리 = sqrt(x,,1,,^2^ + x,,2,,^2^ + x,,3,,^2^ + ... + x,,n,,^2^) === k-means Clustering === {{https://upload.wikimedia.org/wikipedia/commons/e/ea/K-means_convergence.gif||width=500px}} 1. 데이타를 k개로 분류하고자 한다면 1. k개의 random point를 정하고 시작한다. 1. 모든 데이타 점을 조사하여 k개의 point중 어느 것과 제일 가까운지 결정하여, 첫번째 분류를 완료한다. 1. k개의 첫번째 분류에서 각 분류의 평균점을 구한다. 이 평균점을 새로운 k개의 point로 간주하고 위 과정을 반복한다. 1. 더 이상 분류가 바뀌지 않으면 분류를 종료한다. {{{#!highlight r fit <- kmeans(n차원 행렬, k) str(fit) }}} {{{#!highlight rout numbers=disable > str(fit) List of 9 $ cluster : int [1:n] 5 2 1 5 4 5 5 3 1 1 ... (k개의 cluster) $ centers : num [1:5, 1:2] 51.5 20.4 79.7 65.2 39.8 ... (각 cluster center의 x,y 좌표) ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:5] "1" "2" "3" "4" ... .. ..$ : NULL $ totss : num 21631 $ withinss : num [1:5] 51.6 429.1 221.6 174.7 209.9 $ tot.withinss: num 1087 $ betweenss : num 20544 $ size : int [1:5] 11 7 12 12 16 $ iter : int 2 $ ifault : int 0 }}} === Density-Based Spatial Clustering and Application with Noise (DBSCAN) === {{https://upload.wikimedia.org/wikipedia/commons/a/af/DBSCAN-Illustration.svg||width=500}} 1. 같은 그룹으로 묶고 싶은 최대 거리 ε과 같은 그룹을 형성할 수 있는 점의 최소 갯수 minPts를 정한다. 1. 어떤 점 p의 거리 ε사이에 minPts개의 점이 있으면 일단 한 그룹을 만든다. 1. 그 그룹의 모든 점의 ε 거리에 다른 점이 있으면 역시 같은 그룹으로 묶는다. (친구의 친구는 친구) 1. 더 이상 확장이 안 될때까지 확장한다. 1. 계산이 끝난 후에 아무 그룹에도 속하지 않은 점은 outlier(아싸) 처리한다. {{{#!highlight r library("dbscan") fit <- dbscan(n차원 행렬, eps = 최대거리, minPts = 최소점갯수) str(fit) }}} {{{#!highlight rout numbers=disable > str(fit) List of 3 $ cluster: int [1:n] 1 2 3 1 3 1 1 3 3 3 ... (적절한 수의 cluster) $ eps : num 우리가 입력한 값 저장됨 (참고용) $ minPts : num 우리가 입력한 값 저장됨 (참고용) - attr(*, "class")= chr [1:2] "dbscan_fast" "dbscan" }}} == R 실습 == === data 읽어오기 === {{{#!highlight r dataFile <- "https://raw.githubusercontent.com/gehoon/statistics/master/data/grades.csv" grade <- read.csv(url(dataFile)) str(grade) grade$stu.no <- as.character(grade$stu.no) # 학생번호는 숫자지만 텍스트로 인식해달라 grade$class <- factor(grade$class) # 학년은 숫자지만 분류(factor)로 인식해달라 str(grade) }}} === ggplot2 === Clustering 결과를 눈으로 확인하려면 그래프가 쉬움 * r 기본 그래픽 함수대신 편리한 ggplot2를 사용해보자. * 형식: ggplot(data, aes(x열, y열, color=z열)) + [[https://ggplot2.tidyverse.org/reference/index.html#section-layer-geoms|다양한그림함수()]] * 참고: https://ggplot2.tidyverse.org/ {{{#!highlight r # 설치가 안 되어 있다면 한번만 실행 # install.packages('ggplot2') library(ggplot2) ggplot(grade, aes(class, midterm, color=class)) + geom_boxplot() # boxplot ggplot(grade, aes(class, midterm, color=class)) + geom_violin() # violin plot ggplot(grade, aes(class, midterm, color=class)) + geom_violin() + geom_jitter() # geom함수 두개 중첩 ggplot(grade, aes(midterm, attend)) + geom_point() # scatter plot (단색) ggplot(grade, aes(midterm, attend, color=class)) + geom_point(alpha=.7) + xlim(0,100) + ylim(0,11) # grade의 midterm과 attend로 x,y plot을 찍되, 색은 class 별로 다르게 해달라. 투명도는 70% 이고, x,y range는 저렇다. ggplot(grade, aes(midterm, attend, color=hw8)) + geom_point(alpha=.7) + xlim(0,100) + ylim(0,11) ggplot(grade, aes(midterm, hw8, color=attend)) + geom_point(alpha=.7) + xlim(0,100) + ylim(0,20) }}} {{attachment:grade_class.png}} === k-means clustering === {{{#!highlight r fit <- kmeans(grade[,c(3,5)], 5) # grade의 3열 5열 두개를 이용하여 5개로 k-means clustering 하라 fit <- kmeans(cbind(grade$midterm, grade$attend), 5) # grade$midterm 와 grade$attend 를 두개의 컬럼으로 붙힌(cbind) 후, 5개로 k-means clustering 하라 str(fit) ggplot(grade, aes(midterm, attend, color = fit$cluster)) + geom_point() + xlim(0,100) + ylim(0,11) # grade의 midterm과 attend로 x,y plot을 찍되, 색은 fit$cluster 별로 다르게 해달라. }}} {{attachment:grade_kmeans_err.png}} * fit$cluster가 숫자 데이타로 인식되어 continuous coloring이 되어 버렸다. * 이 값을 분류(factor) 데이타로 바꾼후 재시도하자. {{{#!highlight r grade$cluster <- factor(fit$cluster) ggplot(grade, aes(midterm, attend, color = cluster)) + geom_point() + xlim(0,100) + ylim(0,12) ggsave('grade_kmeans.png', width=10, height=2.4) # 그림을 파일로 저장하라. w/h 단위는 inch }}} {{attachment:grade_kmeans.png}} === dbscan clustering === {{{#!highlight r # 설치가 안 되어 있다면 한번만 실행 # install.packages("dbscan") library("dbscan") fit <- dbscan(grade[,c(3,5)], eps = 3.2, minPts = 2) str(fit) grade$cluster <- factor(fit$cluster) ggplot(grade, aes(midterm, attend, color = cluster)) + geom_point() + xlim(0,100) + ylim(0,12) ggsave('grade_dbscan.png', width=20, height=5, units = "cm") # w/h 단위는 cm }}} {{attachment:grade_dbscan.png}} * cluster 0은 outlier다. ----- <>