241008 TIL #509 AI Tech #44 클러스터링(K-means / DBSCAN / GMM)

김춘복·2024년 10월 8일
0

TIL : Today I Learned

목록 보기
511/571

Today I Learned

오늘 배운 내용은 클러스터링 방법!


클러스터링

데이터를 비슷한 특성을 가진 그룹으로 묶는 비지도 학습 기법

  • 데이터를 의미있는 그룹으로 묶어 복잡성을 줄이고 패턴을 볼 수 있다.

  • 분류나 회귀처리 전에 전처리 단계로도 사용된다.

대표적 방법론

Partitioning Methods (파티셔닝)

  • 데이터를 여러개의 클러스터로 나누는 방법으로 대표적으로 K-means가 있다.

  • 클러스터 수를 미리 정의해서 데이터 포인트를 클러스터에 할당하는 방식이다.

  • 구현이 빠르고 대규머 데이터셋에 적합하며, 구형(원형) 분포에 잘 작동한다.

Hierarchical Methods (계층적)

  • 데이터의 계층적 구조를 형성해 클러스터를 만드는 방법으로 Agglomerative(병합식) 및 Divisive(분할식) 방법이 있다.

  • 클러스터 수를 미리 정의할 필요가 없고 클러스터간 관계를 시각적으로 표현할 수 있다.

  • 계산 복잡도가 높아서 대규모 데이터셋에는 비효율적이다.

Density-based Methods (밀도 기반)

  • 데이터포인트의 밀도를 기준으로 클러스터를 형성하는 방법으로 DBSCAN이 대표적이다.

  • 밀도가 낮은 부분은 노이즈로 인식해서 이상치에 robust하다.

  • 클러스터 수는 정할 필요가 없지만 밀도 기준에 따라 적절한 파라미터 설정이 필요하고, 데이터가 불균형하게 분포된경우 성능이 저하될 수 있다.

Grid-based Methods (격자 기반)

  • 데이터 공간을 격자로 나누고 각 격자의 밀도에 따라 클러스터를 형성하는 방법으로 STING이 대표적이다.

  • 메모리 효율성이 좋고, 처리속도가 빨라 대규모 데이터셋에 적합하다.

  • 격자크기를 미리 정해야하고, 복잡한건 모델링을 잘 못할 수 있다.

Model-based Methods (모델 기반)

  • 데이터를 특정 통계 모델을 따른다고 가정해서 그 모델을 기반으로 클러스터를 형성하며 GMM, EM이 대표적이다.

  • 데이터가 여러개의 확률분포로 구성되어있다고 가정한다.

  • 복잡한 데이터 구조를 잘 표현할 수 있고 불확실성을 고려하는 방법이다.

  • 가정에 맞지 않으면 성능이 저하될 수 있고 계산비용이 높다.


1. K-Means

단계

  1. 초기화
    K(클러스터 수)를 설정하고 데이터 포인트중 무작위로 K개의 centroid(중심)을 선택한다.
  2. 클러스터 할당
    각 데이터 포인트를 가장 가까운 클러스터 centroid에 할당하는데 유클리드 거리를 사용한다.
  3. centroid 갱신
    각 클러스터에 할당된 데이터 포인트의 평균을 계산해 클러스터 중심을 업데이트 한다.
  4. 수렴 확인
    클러스터 중심 변화가 매우 작아질때 까지 2~3과정을 반복한다.

특징

  • 거리기반이라 단순하고 계산도 쉽고 속도가 빨라 큰 데이터셋에서도 유용하다.

  • K값을 미리 정해야하고 초기 클러스터 중심 선택에 따라 결과가 달라질 수 있다.
    여러 k를 시도해보고 다른 점과의 거리 제곱합이 갑자기 완만해지는 k값을 찾는다.

  • 구형(원형) 데이터셋에서는 잘 작동하지만 비구형에선 성능이 저하된다.

  • 이상치에 민감하다.

K-Means++

  • 기존 K-Means의 centroid 초기화 과정을 개선해 결과와 수렴 속도를 향상시켰다.
    centroid를 하나만 랜덤하게 선택하고 나머지는 여러 시도중 best를 찾아 시작한다.

  • 다른 K-Means의 문제점은 여전히 존재한다.

  • 예시 코드

from sklearn.cluster import KMeans
import numpy as np

# 임의의 데이터 생성
X = np.random.rand(100, 2)

# K-means++ 알고리즘 실행
kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42)
kmeans.fit(X)

# 클러스터 중심 출력
print("클러스터 중심 좌표:")
print(kmeans.cluster_centers_)

# 각 데이터 포인트의 클러스터 할당 결과 출력
print("각 데이터 포인트의 클러스터 할당:")
print(kmeans.labels_)

2. DBSCAN

  • 밀집된 데이터 포인트 군집을 클러스터로 구분하고 노이즈는 클러스터에 속하지 않는 것으로 처리하는 방식

  • 파라미터
    epsilon (ε) : 데이터 포인트 간의 최대 반경(거리). 서로 이웃이라고 간주할 수 있는 한계
    min_samples : 한 포인트가 core point가 되기위한 이웃의 최소 개수

  • Core point(핵심) : ε 반경 안에 최소한 min_samples개의 이웃이 있는 포인트.
    Border point(경계) : 반경 내에 있지만 핵심 포인트는 아닌 포인트
    Noise Point : 반경안에 없어 클러스터에 속하지 않는 포인트. 클러스터링 결과에서 제외

  • 핵심포인트 탐색 -> 클러스터 확장 -> 경계포인트와 노이즈 처리 단계로 진행된다.

특징

  • 구형(원형)이 아니라도 잘 찾고 노이즈나 이상치에 robust하다.

  • 클러스터 수를 정할 필요가 없다.

  • epsilon과 min_samples 파라미터를 정하는게 까다롭고 클러스터간 밀도가 다르면 어렵다.
    (min_samples은 데이터 차원수의 2배를 일반적으로 사용, eps는 k-distance에서 급증이 있는 값)
    고차원 데이터에서는 비효율적이다.

  • 코드 예시

import numpy as np
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt

# 임의의 2차원 데이터 생성
X = np.random.rand(100, 2)

# DBSCAN 알고리즘 적용
dbscan = DBSCAN(eps=0.1, min_samples=5)
dbscan.fit(X)

# 클러스터 할당 결과
labels = dbscan.labels_

# 클러스터 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='rainbow')
plt.title('DBSCAN Clustering')
plt.show()

3. GMM

  • 모델 기반 클러스터링중 하나로 데이터를 여러개의 가우시안 분포로 모델링 해서 클러스터를 찾는다.

  • 여러 가우시안 분포가 조합되어있다고 봐서, 각 가우시안 분포가 데이터의 클러스터를 나타낸다.
    데이터 포인트가 어느 클러스터에 속할지 확률적으로 할당한다.

  • EM 알고리즘
    각 가우시안 분포의 평균, 공분산, 혼합계수 파라미터를 추정하는 데 사용하는 알고리즘
    아래의 E와 M과정을 수렴할 때까지 반복한다.
    Expectation - 각 데이터 포인트가 각 가우시안 분포에 속할 확률(책임도)을 계산
    Maximization - E에서 계산된 확률을 기반으로 가우시안 분포의 파라미터(평균, 분산, 가중치)를 업데이트

특징

  • 각 데이터 포인트가 각 클러스터에 속할 확률을 계산할 수 있다.

  • 타원형 같은 복잡한 클러스터 구조도 잘 처리하는 유연성을 가진다.

  • 클러스터 수를 미리 정해야하고, 초기화에 민감하며 계산 복잡도가 높다.
    그리고 가정에 맞지 않으면 성능이 안좋다.

  • 코드 예시

import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture

# 임의의 2차원 데이터 생성
X = np.random.rand(300, 2)

# GMM 모델 생성 및 클러스터링 수행 (n_components는 가우시안 분포의 수)
gmm = GaussianMixture(n_components=3, random_state=42)
gmm.fit(X)

# 각 데이터 포인트의 클러스터 할당
labels = gmm.predict(X)

# 클러스터 중심 출력
print("클러스터 중심:")
print(gmm.means_)

# 클러스터링 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='rainbow', s=10)
plt.scatter(gmm.means_[:, 0], gmm.means_[:, 1], c='black', s=100, marker='X')  # 클러스터 중심
plt.title('Gaussian Mixture Model Clustering')
plt.show()
profile
Backend Dev / Data Engineer

0개의 댓글