일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ⌨️Developer/보안
- 개발/webrtc
- 개발/언어론
- 알고리즘
- AI/ML
- 카카오 테크 캠퍼스
- 개발/Electron
- ⌨️Developer
- 대외활동/카카오테크캠퍼스
- 개발
- 개발/Tools/프레임워크/Spring
- 개발/CS/OS
- 개발/에러
- 개발/컴퓨터네트워크
- AI/GPT
- 카테캠
- 개발/CS/알고리즘
- electron
- 개발/MySQL
- 개발/환경
- 개발/보안
- 개발/OOP
- ai
- 개발/Java/Spring
- 개발/Java
- 개발/네트워크
- 개발/언어/Java
- 개발/프레임워크&라이브러리
- 취업
- 카카오테크캠퍼스
- Today
- Total
봄수의 연구실
K - Means 알고리즘 실습 본문
K - Means 알고리즘 실습
Intro
먼저 K-Means Clustering이 무엇인지, 그리고 어떤 실제 세계의 어플리케이션에서 사용되는지 살펴보겠습니다.
K-Means는 군집화 모델 중 가장 단순한 모델 중 하나로, 그 단순함에도 불구하고 많은 데이터 과학 응용 프로그램에서 광범위하게 사용됩니다.
고객 세그멘테이션, 웹사이트 방문자의 행동 이해, 패턴 인식, 기계 학습, 데이터 압축 등에서 특히 유용하게 활용됩니다.
여기에서는 두 가지 예제를 통해 K-Means 클러스터링을 연습하게 될 것입니다.
- 무작위로 생성된 데이터셋에서의 K-Means
- 고객 세그멘테이션을 위한 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()
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'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 |