Home ChungLab Wiki
    • 설명
    • 못 고치는 문서
    • Menu
      • Navigation
      • RecentChanges
      • FindPage
      • 사이트맵
      • Help
      • HelpContents
      • HelpOnMoinWikiSyntax
      • 보기
      • 첨부
      • 정보
      • 원문 보기
      • 인쇄용 화면
      • 수정
      • 로드
      • 저장
    • 로그인

    Navigation

    • FindPage
    • HelpContents
    • FunReading
    2020-09-09 01:16:06에 수정된 2번째 판
    • Class
    • Statistics
    • Clustering

    Clustering

    Classification vs. Clustering

    분류

    Learning 기법

    요약

    Classification

    Supervised

    기분류된 데이타로 회귀 모델을 만들어 분류

    Clustering

    Un-supervised

    데이타 모양(거리)로 unbiased 분류 시도

    Classification

    https://cdn-images-1.medium.com/max/2000/1*ASYpFfDh7XnreU-ygqXonw.png

    • 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

    • training dataset이 없거나 구하기가 어려운 경우, 데이타 자체로 분류
    • 한줄 요약: 거리가 가까운 데이터끼리 같은 그룹으로 분류한다.
      • 거리 = sqrt(x12 + x22 + x32 + ... + xn2)

    k-means Clustering

    https://upload.wikimedia.org/wikipedia/commons/e/ea/K-means_convergence.gif

    1. 데이타를 k개로 분류하고자 한다면
    2. k개의 random point를 정하고 시작한다.
    3. 모든 데이타 점을 조사하여 k개의 point중 어느 것과 제일 가까운지 결정하여, 첫번째 분류를 완료한다.
    4. k개의 첫번째 분류에서 각 분류의 평균점을 구한다. 이 평균점을 새로운 k개의 point로 간주하고 위 과정을 반복한다.
    5. 더 이상 분류가 바뀌지 않으면 분류를 종료한다.

       1 fit <- kmeans(n차원 행렬, k)
       2 str(fit)
    

    > 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

    1. 같은 그룹으로 묶고 싶은 최대 거리 ε과 같은 그룹을 형성할 수 있는 점의 최소 갯수 minPts를 정한다.
    2. 어떤 점 p의 거리 ε사이에 minPts개의 점이 있으면 일단 한 그룹을 만든다.
    3. 그 그룹의 모든 점의 ε 거리에 다른 점이 있으면 역시 같은 그룹으로 묶는다. (친구의 친구는 친구)
    4. 더 이상 확장이 안 될때까지 확장한다.
    5. 계산이 끝난 후에 아무 그룹에도 속하지 않은 점은 outlier(아싸) 처리한다.

       1 library("dbscan")
       2 
       3 fit <- dbscan(n차원 행렬, eps = 최대거리, minPts = 최소점갯수)
       4 str(fit)
    

    > 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 읽어오기

       1 dataFile <- "https://raw.githubusercontent.com/gehoon/statistics/master/data/grades.csv"
       2 grade <- read.csv(url(dataFile))
       3 str(grade)
       4 grade$stu.no <- as.character(grade$stu.no) # 학생번호는 숫자지만 텍스트로 인식해달라
       5 grade$class <- factor(grade$class) # 학년은 숫자지만 분류(factor)로 인식해달라
       6 str(grade)
    

    ggplot2

    Clustering 결과를 눈으로 확인하려면 그래프가 쉬움

    • r 기본 그래픽 함수대신 편리한 ggplot2를 사용해보자.
    • 형식: ggplot(data, aes(x열, y열, color=z열)) + 다양한그림함수()

    • 참고: https://ggplot2.tidyverse.org/

       1 # 설치가 안 되어 있다면 한번만 실행
       2 # install.packages('ggplot2')
       3 library(ggplot2)
       4 
       5 ggplot(grade, aes(class, midterm, color=class)) + geom_boxplot() # boxplot
       6 ggplot(grade, aes(class, midterm, color=class)) + geom_violin() # violin plot
       7 ggplot(grade, aes(class, midterm, color=class)) + geom_violin() + geom_jitter() # geom함수 두개 중첩
       8 
       9 ggplot(grade, aes(midterm, attend)) + geom_point() # scatter plot (단색)
      10 ggplot(grade, aes(midterm, attend, color=class)) + geom_point(alpha=.7) + xlim(0,100) + ylim(0,11)
      11      # grade의 midterm과 attend로 x,y plot을 찍되, 색은 class 별로 다르게 해달라. 투명도는 70% 이고, x,y range는 저렇다.
      12 ggplot(grade, aes(midterm, attend, color=hw8)) + geom_point(alpha=.7) + xlim(0,100) + ylim(0,11)
      13 ggplot(grade, aes(midterm, hw8, color=attend)) + geom_point(alpha=.7) + xlim(0,100) + ylim(0,20)
    

    grade_class.png

    k-means clustering

       1 fit <- kmeans(grade[,c(3,5)], 5) # grade의 3열 5열 두개를 이용하여 5개로 k-means clustering 하라
       2 fit <- kmeans(cbind(grade$midterm, grade$attend), 5)
       3     # grade$midterm 와 grade$attend 를 두개의 컬럼으로 붙힌(cbind) 후, 5개로 k-means clustering 하라
       4 str(fit)
       5 ggplot(grade, aes(midterm, attend, color = fit$cluster)) + geom_point() + xlim(0,100) + ylim(0,11)
       6     # grade의 midterm과 attend로 x,y plot을 찍되, 색은 fit$cluster 별로 다르게 해달라.
    

    grade_kmeans_err.png

    • fit$cluster가 숫자 데이타로 인식되어 continuous coloring이 되어 버렸다.
    • 이 값을 분류(factor) 데이타로 바꾼후 재시도하자.

       1 grade$cluster <- factor(fit$cluster)
       2 ggplot(grade, aes(midterm, attend, color = cluster)) + geom_point() + xlim(0,100) + ylim(0,12)
       3 
       4 ggsave('grade_kmeans.png', width=10, height=2.4) # 그림을 파일로 저장하라. w/h 단위는 inch
    

    grade_kmeans.png

    dbscan clustering

       1 # 설치가 안 되어 있다면 한번만 실행
       2 # install.packages("dbscan")
       3 library("dbscan")
       4 
       5 fit <- dbscan(grade[,c(3,5)], eps = 3.2, minPts = 2)
       6 str(fit)
       7 grade$cluster <- factor(fit$cluster)
       8 ggplot(grade, aes(midterm, attend, color = cluster)) + geom_point() + xlim(0,100) + ylim(0,12)
       9 
      10 ggsave('grade_dbscan.png', width=20, height=5, units = "cm") # w/h 단위는 cm
    

    grade_dbscan.png

    • cluster 0은 outlier다.


    /CentralLimitTheorem   /ChiSquared   /Clustering   /InstallR   /InstallRStudio   /Lies   /NormalDistribution   /RBasic   /RBasic1   /RBasic2   /RBasic3   /RCloud   /RIntro   /RKorean   /T-Test  
    Copyright © ChungLab. Built on MoinMoin and Bootstrap. All Rights Reserved.