오늘 배운 내용은 클러스터링 방법!
데이터를 비슷한 특성을 가진 그룹으로 묶는 비지도 학습 기법
데이터를 의미있는 그룹으로 묶어 복잡성을 줄이고 패턴을 볼 수 있다.
분류나 회귀처리 전에 전처리 단계로도 사용된다.
데이터를 여러개의 클러스터로 나누는 방법으로 대표적으로 K-means
가 있다.
클러스터 수를 미리 정의해서 데이터 포인트를 클러스터에 할당하는 방식이다.
구현이 빠르고 대규머 데이터셋에 적합하며, 구형(원형) 분포에 잘 작동한다.
데이터의 계층적 구조를 형성해 클러스터를 만드는 방법으로 Agglomerative(병합식) 및 Divisive(분할식)
방법이 있다.
클러스터 수를 미리 정의할 필요가 없고 클러스터간 관계를 시각적으로 표현할 수 있다.
계산 복잡도가 높아서 대규모 데이터셋에는 비효율적이다.
데이터포인트의 밀도를 기준으로 클러스터를 형성하는 방법으로 DBSCAN
이 대표적이다.
밀도가 낮은 부분은 노이즈로 인식해서 이상치에 robust하다.
클러스터 수는 정할 필요가 없지만 밀도 기준에 따라 적절한 파라미터 설정이 필요하고, 데이터가 불균형하게 분포된경우 성능이 저하될 수 있다.
데이터 공간을 격자로 나누고 각 격자의 밀도에 따라 클러스터를 형성하는 방법으로 STING
이 대표적이다.
메모리 효율성이 좋고, 처리속도가 빨라 대규모 데이터셋에 적합하다.
격자크기를 미리 정해야하고, 복잡한건 모델링을 잘 못할 수 있다.
데이터를 특정 통계 모델을 따른다고 가정해서 그 모델을 기반으로 클러스터를 형성하며 GMM, EM
이 대표적이다.
데이터가 여러개의 확률분포로 구성되어있다고 가정한다.
복잡한 데이터 구조를 잘 표현할 수 있고 불확실성을 고려하는 방법이다.
가정에 맞지 않으면 성능이 저하될 수 있고 계산비용이 높다.
거리기반이라 단순하고 계산도 쉽고 속도가 빨라 큰 데이터셋에서도 유용하다.
K값을 미리 정해야하고 초기 클러스터 중심 선택에 따라 결과가 달라질 수 있다.
여러 k를 시도해보고 다른 점과의 거리 제곱합이 갑자기 완만해지는 k값을 찾는다.
구형(원형) 데이터셋에서는 잘 작동하지만 비구형에선 성능이 저하된다.
이상치에 민감하다.
기존 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_)
밀집된 데이터 포인트 군집을 클러스터로 구분하고 노이즈는 클러스터에 속하지 않는 것으로 처리하는 방식
파라미터
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()
모델 기반 클러스터링중 하나로 데이터를 여러개의 가우시안 분포로 모델링 해서 클러스터를 찾는다.
여러 가우시안 분포가 조합되어있다고 봐서, 각 가우시안 분포가 데이터의 클러스터를 나타낸다.
데이터 포인트가 어느 클러스터에 속할지 확률적
으로 할당한다.
EM 알고리즘
각 가우시안 분포의 평균, 공분산, 혼합계수 파라미터를 추정하는 데 사용하는 알고리즘
아래의 E와 M과정을 수렴할 때까지 반복한다.
E
xpectation - 각 데이터 포인트가 각 가우시안 분포에 속할 확률(책임도)을 계산
M
aximization - 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()