kang's study
13일차 : k-평균 본문
KMeans 클래스¶
In [1]:
# !wget https://bit.ly/fruits_300_data -O fruits_300.npy
In [2]:
import numpy as np
fruits = np.load('fruits_300_data')
# 2차원 배열로 만든다. (샘플개수, 너비×높이)
fruits_2d = fruits.reshape(-1, 100*100)
In [3]:
from sklearn.cluster import KMeans
km = KMeans(n_clusters = 3, random_state = 42) # 10번 수행 n_iter
km.fit(fruits_2d) # 타깃이 없다
Out[3]:
In [4]:
print(km.labels_) # 군집된 결과 n=3이라 배열의 값은 0,1,2 중 하나
In [5]:
print(np.unique(km.labels_, return_counts=True))
In [6]:
import matplotlib.pyplot as plt
def draw_fruits(arr, ratio=1): # 출력할 이미지의 배열
n = len(arr) # n은 샘플 개수입니다
# 한 줄에 10개씩 이미지를 그립니다.
# 샘플 개수를 10으로 나누어 전체 행 개수를 계산합니다.
rows = int(np.ceil(n/10))
# 행이 1개 이면 열 개수는 샘플 개수입니다. 그렇지 않으면 10개입니다.
cols = n if rows < 2 else 10
fig, axs = plt.subplots(rows, cols,
figsize=(cols*ratio, rows*ratio), squeeze=False)
# for 문 안에서 axs를 항상 2차원 배열로 다루기 위해서 squeeze 매개변수를 False
for i in range(rows):
for j in range(cols):
if i*10 + j < n: # n 개까지만 그립니다.
axs[i, j].imshow(arr[i*10 + j], cmap='gray_r')
axs[i, j].axis('off')
plt.show()
In [7]:
draw_fruits(fruits[km.labels_==0])
In [8]:
draw_fruits(fruits[km.labels_==1])
In [9]:
draw_fruits(fruits[km.labels_==2])
클러스터 중심¶
In [10]:
draw_fruits(km.cluster_centers_.reshape(-1, 100, 100), ratio=3)
In [11]:
print(km.transform(fruits_2d[100:101]))
# transform() 메서드에 2차원 배열을 입력해야 한다.
# 훈련 데이터 샘플에서 클러스터 중심까지 거리
In [12]:
print(km.predict(fruits_2d[100:101])) # 가장 가까운 클러스터를 할당해줌
In [13]:
draw_fruits(fruits[100:101])
In [14]:
print(km.n_iter_) # 중심이동 반복 횟수
최적의 k 찾기¶
In [15]:
inertia = []
for k in range(2, 7):
km = KMeans(n_clusters=k, random_state=42)
km.fit(fruits_2d)
inertia.append(km.inertia_)
# 클러스터의 중심에서 샘플까지의 거리들의 평균, 낮은 값이면 조밀하게 모여있음
plt.plot(range(2, 7), inertia)
plt.xlabel('k')
plt.ylabel('inertia')
plt.show()
#이너셔의 감소 정도가 꺾이는 클러스터 개수를 찾는다
원형의 데이터에서 잘 동작한다. (특성간의 거리가 비슷하게 분포)¶
출처 : 박해선, 『혼자공부하는머신러닝+딥러닝』, 한빛미디어(2021), p303-315
'[학습 공간] > [혼공머신러닝]' 카테고리의 다른 글
15일차 : 인공신경망 ANN, Artificial neural network (0) | 2022.03.03 |
---|---|
14일차 : 차원축소 (0) | 2022.03.03 |
12일차 : 군집 알고리즘 (0) | 2022.03.03 |
11일차 : 트리의 앙상블 (0) | 2022.03.03 |
10일차 : 교차검증과 그리드 서치 (0) | 2022.03.03 |
Comments