예제
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=150, n_features=2, centers=3, random_state=0)
X.shape # (150, 2)
y.shape # (150,)
import pandas as pd
pd.Series(y).value_counts()
1 50 0 50 2 50 dtype: int64
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, random_state=0)
# 비지도 학습
pred = km.fit_predict(X)
pd.Series(pred).value_counts()
2 52 1 50 0 48 dtype: int64
# 한글 깨짐 없이 나오게 설정
from matplotlib import rcParams # 인코딩 폰트 설정
rcParams['font.family'] = 'New Gulim'
rcParams['font.size'] = 10
plt.figure(figsize=(10,4))
plt.subplot(1,2,1)
plt.scatter(X[:,0],X[:,1],c=pred,s=10)
plt.title('추정')
plt.subplot(1,2,2)
plt.scatter(X[:,0],X[:,1],c=y,s=10)
plt.title('정답')
plt.show()
# 학습된 클러스터들의 centroids를 화면에 표시해본다
centroids = km.cluster_centers_
centroids
array([[ 0.91563959, 4.44602508], [-1.73388472, 3.00577412], [ 2.07417555, 1.04097145]])
# 적색 별 모양의 표시를 각 centroid에 해본다
plt.scatter(X[:,0],X[:,1],c=pred,s=10)
plt.scatter(centroids[:,0],centroids[:,1],c='r',marker='*')
plt.title('centroid 표시')
plt.show()
# 앨보우 차트
# 클러스터의 갯수와 inertia의 값을 라인차트에 표시한 것수
# inertia : 센트로이드와 클러스터 소속 값들의 거리의 제곱의 합
inertia = []
for i in range(1,11):
km = KMeans(n_clusters=i, random_state=0)
km.fit(X)
inertia.append(km.inertia_)
plt.plot(range(1,11), inertia, marker='o')
plt.xlabel("Number of Clusters")
plt.ylabel("Inertia")
plt.show()