봄수의 연구실

K - Means 알고리즘 실습 본문

AI

K - Means 알고리즘 실습

berom 2023. 7. 12. 11:32

K - Means 알고리즘 실습

Intro

먼저 K-Means Clustering이 무엇인지, 그리고 어떤 실제 세계의 어플리케이션에서 사용되는지 살펴보겠습니다.

K-Means는 군집화 모델 중 가장 단순한 모델 중 하나로, 그 단순함에도 불구하고 많은 데이터 과학 응용 프로그램에서 광범위하게 사용됩니다.
고객 세그멘테이션, 웹사이트 방문자의 행동 이해, 패턴 인식, 기계 학습, 데이터 압축 등에서 특히 유용하게 활용됩니다.

여기에서는 두 가지 예제를 통해 K-Means 클러스터링을 연습하게 될 것입니다.

  1. 무작위로 생성된 데이터셋에서의 K-Means
  2. 고객 세그멘테이션을 위한 K-Means 사용

1단계: 무작위 데이터셋 생성

먼저, 실습을 위한 데이터셋을 생성해 보겠습니다.
여기서는 numpy의 random.seed() 함수를 사용하여 랜덤 seed를 설정하고, make_blobs 클래스를 이용하여 무작위로 클러스터가 형성된 점들을 생성하겠습니다.

np.random.seed(0)  X, y = make_blobs(n_samples=5000, centers=[[4,4], [-2, -1], [2, -3], [1, 1]], cluster_std=0.9) 

위의 코드에서 make_blobs 클래스는 다음과 같은 인자들을 받습니다:

  • n_samples : 클러스터 간에 균등하게 나누어질 전체 점의 수. 이번 예제에서는 5000으로 설정했습니다.
  • centers : 생성할 중심의 수 또는 고정된 중심 위치들. 이번 예제에서는 [[4,4], [-2, -1], [2, -3], [1, 1]]을 사용했습니다.
  • cluster_std : 클러스터의 표준편차. 이번 예제에서는 0.9로 설정했습니다.

이렇게 생성된 X는 [n_samples, n_features] 형태의 배열로, 생성된 샘플들이며, y는 [n_samples] 형태의 배열로 각 샘플의 클러스터 멤버십에 대한 정수 레이블입니다.

2단계: 무작위로 생성된 데이터 시각화

생성된 데이터셋을 시각화하여 어떻게 분포되어 있는지 확인해 봅니다.

plt.scatter(X[:, 0], X[:, 1], marker='.') 

위의 코드를 실행하면, 각 데이터 포인트가 2차원 공간에 어떻게 분포되어 있는지 볼 수 있는 산점도를 생성합니다.
이를 통해 데이터의 분포와 클러스터를 직관적으로 이해할 수 있습니다

실습

3단계: K-Means 설정

이제 무작위 데이터가 준비되었으므로 K-Means 클러스터링을 설정해보겠습니다.
K - Means 클래스는 많은 파라미터를 가지고 있지만, 여기서는 다음의 세 가지를 사용하겠습니다:

  • init : 중심점의 초기화 방법. "k-means++"를 사용하겠습니다.
    • k-means++는 K-means 클러스터링의 초기 클러스터 중심을 지능적으로 선택하여 수렴을 가속화하는 방법입니다.
  • n_clusters : 생성할 클러스터의 수 및 중심점의 수.
    • 우리는 4개의 중심을 가진 데이터를 생성했으므로 4를 사용하겠습니다.
  • n_init : 다른 중심점 시드로 K-means 알고리즘이 실행되는 횟수.
    • 최종 결과는 관성(inertia) 측면에서 n_init 연속 실행의 가장 좋은 출력이 될 것입니다. 여기서는 12를 사용하겠습니다.

이러한 파라미터를 가지고 KMeans를 초기화합니다.

k_means = KMeans(init = "k-means++", n_clusters = 4, n_init = 12) 

그리고 생성한 피처 행렬 X로 KMeans 모델을 학습시킵니다.

k_means.fit(X) 

이제 KMeans의 .labels_ 속성을 사용하여 모델 내 각 포인트에 대한 레이블을 가져와서 k_means_labels로 저장합니다.

k_means_labels = k_means.labels_ print(k_means_labels) 

또한 KMeans의 .cluster_centers_를 사용하여 클러스터 중심의 좌표를 가져와 k_means_cluster_centers에 저장합니다.

k_means_cluster_centers = k_means.cluster_centers_ print(k_means_cluster_centers) 

4단계: 시각화 작성

이제 무작위 데이터가 생성되었고, KMeans 모델이 초기화되었으니 이를 플로팅하여 어떻게 보이는지 확인해 보겠습니다.

# 지정된 차원으로 플롯을 초기화합니다. fig = plt.figure(figsize=(6, 4))  # 색상은 색상 맵을 사용하며, 레이블 수에 따라 색상 배열을 생성합니다. colors = plt.cm.Spectral(np.linspace(0, 1, len(set(k_means_labels))))  # 플롯을 생성합니다. ax = fig.add_subplot(1, 1, 1)  # 데이터 포인트와 중심을 플로팅하는 루프. for k, col in zip(range(len([[4,4], [-2, -1], [2, -3], [1, 1]])), colors):      # 클러스터에 있는 데이터 포인트를 true로, 그렇지 않으면 false로 레이블링하는 모든 데이터 포인트의 목록을 만듭니다.     my_members = (k_means_labels == k)          # 중심(또는 클러스터 센터)를 정의합니다.     cluster_center = k_means_cluster_centers[k]          # 색상 col로 데이터 포인트를 플롯합니다.     ax.plot(X[my_members, 0], X[my_members, 1], 'w', markerfacecolor=col, marker='.')          # 지정된 색상으로 중심을 플롯하되, 테두리는 더 어둡게 표시합니다.     ax.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,  markeredgecolor='k', markersize=6)  # 플롯의 제목을 설정합니다. ax.set_title('KMeans')  # x축 눈금을 제거합니다. ax.set_xticks(())  # y축 눈금을 제거합니다. ax.set_yticks(())  # 플롯을 표시합니다. plt.show() 

연습

연습: 클러스터 수 변경

위의 데이터셋을 3개의 클러스터로 클러스터링해보겠습니다. 주의: 데이터를 다시 생성하지 않고, 위의 동일한 데이터셋을 사용합니다.

k_means3 = KMeans(init = "k-means++", n_clusters = 3, n_init = 12) k_means3.fit(X) 

클러스터 중심의 좌표를 구해보겠습니다.

k_means_cluster_centers3 = k_means3.cluster_centers_ print(k_means_cluster_centers3) 

그리고 각 포인트에 대한 레이블도 구해보겠습니다.

k_means_labels3 = k_means3.labels_ print(k_means_labels3) 

이제 이를 시각화해보겠습니다.

# 지정된 차원으로 플롯을 초기화합니다. fig = plt.figure(figsize=(6, 4))  # 색상은 색상 맵을 사용하며, 레이블 수에 따라 색상 배열을 생성합니다. colors = plt.cm.Spectral(np.linspace(0, 1, len(set(k_means_labels3))))  # 플롯을 생성합니다. ax = fig.add_subplot(1, 1, 1)  # 데이터 포인트와 중심을 플로팅하는 루프입니다. for k, col in zip(range(len([[4,4], [-2, -1], [1, 1]])), colors):      # 클러스터에 있는 데이터 포인트를 true로, 그렇지 않으면 false로 레이블링하는 모든 데이터 포인트의 목록을 만듭니다.     my_members = (k_means_labels3 == k)          # 중심(또는 클러스터 센터)를 정의합니다.     cluster_center = k_means_cluster_centers3[k]          # 색상 col로 데이터 포인트를 플롯합니다.     ax.plot(X[my_members, 0], X[my_members, 1], 'w', markerfacecolor=col, marker='.')          # 지정된 색상으로 중심을 플롯하되, 테두리는 더 어둡게 표시합니다.     ax.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,  markeredgecolor='k', markersize=6)  # 플롯의 제목을 설정합니다. ax.set_title('KMeans')  # x축 눈금을 제거합니다. ax.set_xticks(())  # y축 눈금을 제거합니다. ax.set_yticks(())  # 플롯을 표시합니다. plt.show() 

Mataplotlib로도 만들어보자

from sklearn.cluster import KMeans import matplotlib.pyplot as plt  # KMeans 모델 생성 및 학습 k_means1 = KMeans(init = "k-means++", n_clusters = 5, n_init = 12) k_means1.fit(X)  # 클러스터 레이블 및 중심점 추출 k_means_labels1 = k_means1.labels_ k_means_cluster_centers1 = k_means1.cluster_centers_  # 데이터와 클러스터 중심 시각화 plt.scatter(X[:, 0], X[:, 1], c=k_means_labels1, s=3, cmap='viridis')  plt.scatter(k_means_cluster_centers1[:, 0], k_means_cluster_centers1[:, 1], c='black', s=200, alpha=0.5) plt.title("KMeans Clustering with 5 clusters") plt.show() 

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

728x90

'AI' 카테고리의 다른 글

계층적 클러스터링  (0) 2023.07.16
Intro. 머신러닝 개념 쉽게 잡고 가자  (0) 2023.07.13
K-Means Clustering  (0) 2023.07.12
Clustering  (0) 2023.07.11
Support Vector Machine  (0) 2023.07.11