No Story, No Ecstasy

[ADP 실기 with R] 3. 군집 분석: Hierarchical Clustering, K-means, DBSCAN/HDBSCAN, SOM, Mixture Distribution Clustering 본문

Data Science Series

[ADP 실기 with R] 3. 군집 분석: Hierarchical Clustering, K-means, DBSCAN/HDBSCAN, SOM, Mixture Distribution Clustering

heave_17 2020. 12. 12. 17:16

https://images.app.goo.gl/JqMQYwWnGRjVLKs79

 

1. Hierarchical Clustering (계층적 군집분석)

  - 유사한 데이터들을 거리 기반으로 점진적으로 병합(bottom-up)하거나 분할(top-down)하는 계층 기법

  - 단계를 거칠 때마다 그룹의 개수가 단조적으로 증가/감소하기 때문에 그룹 형성 과정을 계층적으로 표현할 수 있다.

  - 데이터 연결 방법: 최단연결법, 최장연결법, 평균연결법, 와드연결법

  - R 코드 예제

# 0. 별도의 package import 필요 없음

# 1. 데이터 간 거리 구하기
##  - 거리: euclidean, maximum, manhattan, canberra, binary, minkowski
ha.dist = dist(data, method = "euclidean")

# 2. 계층적 군집분석 수행
##  - 거리: ward.D, ward.D2, single, complete, average, mcquitty, median, centroid
ha.clustering = hclust(data^2, method = "single")

# 3. 덴드로그램으로 결과 확인 후 최적 그룹 개수 결정
plot(ha.clustering)
ha.group = cutree(ha.clustering, k = 10)

# 4. 최종 클러스터링 결과 시각화
rect.hclust(ha.clustering, k = 10, border = "red")

 

2. K Means

  - 데이터를 k개 그룹으로 분할 후, 다른 그룹으로 재배치하는 iterative relocation 반복하는 분할 기법

  - 쉽고 직관적이나, 데이터 셋이 복잡한 형태를 가질 경우(not convex)에는 활용하기 어렵다.

  - R 코드 예제

# 0. package import
library(NbClust)

# 1. 군집분석 수행
##  - min.nc / max.nc: 최소/최대 군집 개수
##  - distance: euclidean, maximum, manhattan, canberra, binary, minkowski, NULL (the user give diss)
##  - method: ward.D, ward.D2, single, complete, average, mcquitty, median, centroid, kmeans
km.clustering = NbClust(data, min.nc = 2, max.nc = 20, method = "kmeans", distaance = "euclidean")

 

3. DBSCAN (Density based Scan)

  - 각 군집 내 데이터가 최소한의 밀도를 만족시키도록 군집을 구성하는 밀도 기반 기법

  - 구형이 아닌 임의의 형태의 군집을 발견하는데 효과적이다.

  - noise가 나올 수 있다(클러스터링되지 않는 데이터가 생긴다).

  - 알고리즘

    1. 무작위로 데이터 선택

    2. 선택된 데이터로부터 지정된 거리 안의 모든 데이터(이웃) 탐색

    3. 이웃의 개수가 최소기준보다 많으면(아닐 시 noise 처리) 클러스터 생성 후 이웃 확인

    4. 이웃이 클러스터에 할당되지 않았으면 해당 클러스터에 할당 후 이웃의 이웃을 탐색

    5. 클러스터 내의 모든 이웃에 대하여 더 이상 이웃이 없을 때까지 단계 4를 반복

    6. 한 번도 방문한 적 없는 데이터에 대하여 단계 1-4 반복

  - DBSCAN은 2개의 hyper parameters(밀도 계산 거리, 거리 내 최소 데이터 개수)를 지정해야 한다.

    (파라미터 조정 관련 링크: https://leedakyeong.tistory.com/entry/R-DBSCAN-파라미터-조정방법-in-r-How-to-select-parameters-for-dbscan-in-r?category=843676)

  - R 코드 예제

# 0. package import
library(dbscan) 
library(fpc) # 둘 다 되는 듯

# 1. dbscan 학습
##  - eps: size of the epsilon neighborhood
##  - minPts: number of minimum points in the eps region (for core points). Default is 5 points.
db.model = dbscan(train_data, eps = sqrt(10), minPts = 4)

# 2. dbscan 해석
##  - db.model$cluster: 각 데이터 포인트의 클러스터 (0은 noise)

 

4. HDBSCAN (Hierarchical Density based Scan)

  - HDBSCAN은 DBSCAN과 계층(Hierarchical)적 군집분석 개념을 통합한 기법

  - DBSCAN과 다르게 eps를 설정할 필요가 없다. (어차피 결과가 계층구조로 나오기 때문)

  - R 코드 예제

# 0. package import
library(dbscan)

# 1. hdbscan 학습
##  - minPts: number of minimum points in the eps region (for core points). Default is 5 points.
hdb.model = hdbscan(train_data, minPts = 4)

# 2. dbscan 해석
plot(hdb.model, show_flat = T)

 

5. SOM (Self Organizing Map)

  - 차원 축소 및 클러스터링이 동시에 수행되는 분류 기법

  - 인공신경망을 활용하여 원래 공간에서 유사한 데이터끼리 저차원에서 인접한 격자로 연결한다.

    1. 경쟁 단계: 각 뉴런의 가중치와 입력 데이터 간 거리를 산출 > 뉴런 간 (입력 데이터를 할당받기 위한) 경쟁

    2. 협력 단계: 경쟁에서 승리한 뉴런이 topological neighbors에서 유리한 위치를 차지한다.

    3. 적응 단계: 승리한 뉴런의 가중치와 topological neighbors 뉴런을 업데이트한다.

                     (코호넨의 승자 독점 규칙에 따라 topological neighbors에 대한 연결 강도 조정)

  - R 코드 예제

# 0. package import
library(kohonen)

# 1. 공간(grid 개수 및 모양) 설정
##  - topo: rectangular, hexagonal
##  - neighbourhood.fct: bubble, gaussian
som.grid = somgrid(xdim = 3, ydim = 5, topo = "hexagonal")

# 2. SOM 학습
##  - rlen: the number of times the complete data set will be presented to the network.
##  - alpha: learning rate (decline from a to b)
som.model = supersom(train_data, som.grid, rlen = 200, alpha = c(0.05, 0.01))

# 3. 모델링 결과 확인
plot(som.model, type = "changes") #데이터 간 거리 감소 추세 확인
plot(som.model, type = "count") #각 뉴런이 몇 개의 데이터와 맵핑되는지 확인 (골고루 맵핑되어야 이상적)
plot(som.model, type = "dist.neighbours") #(U-matrix)를 그리기 (값이 높을수록 이상적)
plot(som.model, type = "codes") #각 class가 뉴런의 학습에 기여한 기여율 확인

# 4. 모델로 예측
som.predict = predict(som.model, test_data)

 

6. 혼합분포군집 

  - 모형 기반 군집 기법: 데이터가 k개의 모수적 모형의 가중합으로 분포되었다고 가정

  - k개 모형의 모수와 가중치를 추정하여, 가장 큰 비중을 차지하는 모형(클러스터)에 데이터를 할당

    - EM (Expectation-Maximization) 알고리즘 활용

  - R 코드 예제

# 0. package import
library(mclust)

# 1. 군집분석 수행
##  - G: An integer vector specifying the numbers of mixture components (clusters) for which the BIC is to be calculated
mc.clustering = Mclust(data, G = 2:10)

# 2. 분석 결과 확인
summary(mc.clustering, parameters = T)