일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- DBSCAN
- 파이썬
- 타입스크립트
- 차원 축소
- ADP
- docker
- 캐글
- 클러스터링
- Machine Learning
- python
- 프론트엔드
- 머신러닝
- ADP 실기
- 대감집
- 최적화
- frontend
- Kaggle
- 구글
- 쿠버네티스
- 대감집 체험기
- 리액트
- TooBigToInnovate
- r
- React
- 빅쿼리
- 심층신경망
- do it
- Kubernetes
- bigquery
- LDA
- Today
- Total
No Story, No Ecstasy
[ADP 실기 with R] 3. 군집 분석: Hierarchical Clustering, K-means, DBSCAN/HDBSCAN, SOM, Mixture Distribution Clustering 본문
[ADP 실기 with R] 3. 군집 분석: Hierarchical Clustering, K-means, DBSCAN/HDBSCAN, SOM, Mixture Distribution Clustering
heave_17 2020. 12. 12. 17:16
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)