본문 바로가기
AI/Machine-Learning

[sklearn] KMeans

by Wikinist 2023. 8. 31.

KMeans는 데이터를 비지도 학습 방법으로 클러스터링하기 위해 사용되는 머신러닝 알고리즘 중 하나입니다. 클러스터링은 비슷한 특성을 가진 데이터 포인트들을 그룹화하는 작업을 의미합니다. 각 그룹은 "클러스터"라고 불립니다. KMeans 알고리즘은 데이터를 K개의 클러스터로 분류하며, 각 클러스터는 데이터 포인트들의 유사도를 기반으로 형성됩니다.

KMeans 알고리즘의 작동 방식

선택한 클러스터 개수 K를 설정합니다: KMeans 알고리즘을 사용하려면 먼저 클러스터의 개수를 결정해야 합니다. 이는 사용자가 사전에 결정해야 하는 하이퍼파라미터입니다.

중심 초기화: 알고리즘은 초기에 각 클러스터의 중심을 임의의 데이터 포인트로 설정합니다.

할당 단계 (Assignement Step): 각 데이터 포인트는 가장 가까운 중심에 할당됩니다. 이 때 거리 측정은 일반적으로 유클리드 거리 등을 사용합니다.

업데이트 단계 (Update Step): 할당된 데이터 포인트들을 기반으로 새로운 중심이 계산됩니다. 각 클러스터에 속한 데이터 포인트들의 평균 위치로 중심을 업데이트합니다.

3번과 4번을 반복: 할당과 업데이트 단계를 번갈아가며 여러 번 반복합니다. 중심의 업데이트는 데이터 포인트의 할당이 변하지 않을 때까지 계속됩니다.

수렴: 할당이 변하지 않거나 지정한 반복 횟수에 도달하면 알고리즘은 수렴했다고 판단하고 종료합니다.

최종 클러스터: 알고리즘이 종료되면 각 데이터 포인트는 가장 가까운 중심에 할당되어 클러스터가 형성됩니다.

KMeans는 간단하고 빠른 클러스터링 알고리즘 중 하나로, 데이터의 분포가 원형으로 가정될 때 잘 작동합니다. 그러나 클러스터의 개수를 미리 지정해야 하는 단점이 있으며, 초기 중심 설정에 따라 결과가 달라질 수 있습니다. 이런 한계를 극복하기 위해 여러 가지 KMeans의 변형 알고리즘이나 초기화 방법들이 개발되기도 합니다.

inertia

inertia는 KMeans 클러스터링 알고리즘에서 사용되는 개념으로, 클러스터 내 데이터 포인트들과 해당 클러스터의 중심 간의 거리의 합을 나타냅니다. 간단하게 말해, 클러스터 내부의 데이터 포인트들이 얼마나 중심 주변에 모여 있는지를 측정하는 값입니다. Inertia 값이 낮을수록 클러스터의 내부 데이터 포인트들이 중심 주변에 더 밀집해 있음을 의미하며, 이는 좋은 클러스터링 결과로 간주됩니다.

inertia 수식

KMeans 알고리즘은 이 Inertia 값을 최소화하도록 중심을 조정하면서 클러스터링을 수행합니다. 알고리즘이 수렴하게 되면 Inertia 값은 최소화된 상태로 유지됩니다. 이렇게 Inertia 값을 활용하여 클러스터의 품질을 평가하고 적절한 클러스터 개수를 결정할 수 있습니다.

아래의 코드에서 inertia_values는 각 클러스터 개수(K)에 대한 Inertia 값을 저장하는 리스트입니다. 일반적으로 K 값을 변화시키면서 Inertia 값을 계산하고, Inertia 값이 감소하다가 특정 지점 이후에 변화가 미미하게 되는 지점을 찾아 적절한 클러스터 개수를 결정할 수 있습니다. 이렇게 하는 이유는 클러스터 개수가 증가함에 따라 Inertia 값이 감소할 것이지만, 클러스터 개수가 증가할수록 더 이상 의미 있는 구분이 아닌 잡음까지 고려하게 되기 때문입니다.

아래는 inertia 값을 계산하고 그래프로 표현하는 간단한 예제 코드입니다. 이 코드는 scikit-learn의 KMeans를 사용하여 데이터를 클러스터링하고, 각 클러스터 개수에 대한 inertia 값을 계산하고 그래프로 나타냅니다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# 가상의 데이터 생성
n_samples = 300
n_features = 2
n_clusters = 3
random_state = 42
X, _ = make_blobs(n_samples=n_samples, n_features=n_features, centers=n_clusters, random_state=random_state)

# 클러스터 개수에 따른 Inertia 값 저장할 리스트
inertia_values = []

# 다양한 클러스터 개수에 대해 KMeans 알고리즘 수행
for k in range(1, 11):
    km = KMeans(n_clusters=k, random_state=random_state)
    km.fit(X)
    inertia_values.append(km.inertia_)

# Inertia 값 그래프로 표시
plt.plot(range(1, 11), inertia_values, marker='o')
plt.title('Elbow Method for Optimal K')
plt.xlabel('Number of Clusters')
plt.ylabel('Inertia')
plt.show()

위 코드는 클러스터 개수에 따른 Inertia 값을 그래프로 나타냅니다. 그래프를 통해 Inertia 값의 감소 속도가 둔화되는 지점을 찾아서 클러스터 개수를 결정할 수 있습니다. 이 예제에서는 make_blobs 함수를 사용하여 가상의 데이터를 생성하고, 클러스터 개수는 3개로 설정하였습니다. 실제 데이터에 적용할 때에는 데이터의 특성과 문제에 맞게 적절한 값을 사용하시면 됩니다.

예제

import seaborn as sns
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.cluster import KMeans

# Iris 데이터셋 로드
iris = datasets.load_iris()
X = iris.data  # 모든 피처 사용

# K-means 클러스터링 수행 (3개의 클러스터로 가정)
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
labels = kmeans.labels_  # 클러스터 레이블

# 클러스터링 결과를 데이터프레임에 추가
import pandas as pd
df = pd.DataFrame(X, columns=iris.feature_names)
df['Cluster'] = labels

# 클러스터별 pairplot 그리기
sns.set(style="ticks")
sns.pairplot(df, hue="Cluster", palette="viridis")
plt.suptitle("Pairplot of Clustered Iris Data (All Features)")
plt.show()

이 코드는 모든 피처를 사용하여 K-means 클러스터링을 수행하고, 클러스터별로 피처 간의 관계를 pairplot을 사용하여 시각화합니다. 각 클러스터에 속한 데이터 포인트는 다른 색상으로 표시되어 있으며, 각 피처 간의 관계를 쉽게 비교할 수 있습니다.

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

'AI > Machine-Learning' 카테고리의 다른 글

불균형 데이터 처리 - 샘플링  (0) 2023.09.03
시계열 데이터 분석 - ARIMA  (0) 2023.09.02
[sklearn] KFold와 cross_val_score  (0) 2023.08.31
앙상블(Ensemble)  (0) 2023.08.30
[sklearn] 결정트리  (0) 2023.08.30