본문 바로가기
Python/머신러닝+딥러닝 Ⅰ

비지도학습 : K-means(평균) 알고리즘

by Mr.DonyStark 2024. 4. 6.

□ K-means(평균) 알고리즘

  ○ 평균값이 클러스터 중심에 위치하기 때문에 클러스터 중심 또는 센트로이드라고 부름

  무작위로 k개의 클러스터 중심을 정함
   각 샘플에서 가장 가까운 클러스터 중심을 찾아 해당 클러스터의 클러스터의 샘플로 지정
   클러스터에 속한 샘플의 평균값으로 클러스터 중심을 변경
   클러스터 중심에 변화가 없을때까지 2번으로 돌아가 반복

 

□ 코드

**비지도학습이라 fit 과정에서 타겟데이터를 사용하지 않음.

 ○ 데이터 로드

#데이터 로드
import numpy as np

fruits = np.load("C:/dPython/fruits_300.npy")

fruits_2d = fruits.reshape(-1,100*100) #차원죽소를 통한 2차원 변경 for 모델훈련을 위해
fruits_2d

로우데이터 2차원으로 전처리

 ○ 모델생성

#모델생성
from sklearn.cluster import KMeans
km = KMeans(n_clusters = 3, random_state = 42) #클러스터 3개만들기
km.fit(fruits_2d) #모델학습

 ○ 레이블 확인 .labels_ : 데이터별 라벨부여

#데이터에대한 라벨
print(km.labels_)
#라벨별 개수 확인
print(np.unique(km.labels_, return_counts=True))

 

 ○ 데이터 라벨 부여작업이 끝난 후 데이터별  시각화

   - 라벨이 0인 것만 시각화를 해보니 파인에플이 나옴(일부 사과와 바나나가 있긴함)

import matplotlib.pyplot as plt
import numpy as np

#함수정의
def draw_fruits(arr, ratio=0.5): #figsize는 ratio매개변수에 비례하여 커짐
    n = len(arr) #n 샘플개수
    rows = int(np.ceil(n/10)) #한줄에 10개씩 이미지 그리기. 샘플 개수를 10으로 나누어 전체 행 개수 계산
    cols = n if rows < 2 else 10
    fig, axs = plt.subplots(rows, cols, figsize=(cols*ratio, rows*ratio), squeeze=False)

    for i in range(rows):
        for j in range(cols):
            if i * 10 + j < n:
                axs[i,j].imshow(arr[i*10 + j], cmap="gray_r")
            axs[i,j].axis('off')
    plt.show()

draw_fruits(fruits[km.labels_==0])

   - 라벨이 1인 것을 시각화하니 바나나가 나옴

draw_fruits(fruits[km.labels_==1])

   - 라벨이 2인것을 확인하니 사과가 나옴

draw_fruits(fruits[km.labels_==2])

   - 클러스터 중심값을 기반으로 시각화를 해보니 파인에플, 바나나, 사과의 형태가 그려짐

draw_fruits(km.cluster_centers_.reshape(-1,100,100), ratio=3)

   - 클러스터 중심값을 기반의 평균값

print(km.transform(fruits_2d[100:101]))

   - 100번째 과일에 대한 예측진행

print(km.predict(fruits_2d[100:101]))

 

   -  클러스터 반복회수 파악 : .n_iter_

print(km.n_iter_)

 

□ 최적의 k 찾기

  ○ k-평균 알고리즘은 클러스터 중심과 클러스터에 속한 샘플사이의 거리를 잴 수 있는데 이를 이너셔(inertial)라고 부름

   거리의 제곱 합이 이너셔임
   이너셔는 클러스터에 속한 샘플이 얼마나 가깝게 모여 있는지를 나타내는 값임
   일반적으로 클러스터 개수가 늘어나면 클러스터 개개의 크기는 줄어들기 때문에 이너셔도 줄어듬.
   클러스터 중심에 변화가 없을때까지 2번으로 돌아가 반복

    클러스트 개수를 증가시키면서 이너셔를 그래프로 그리면 감소하는 속도가 꺾이는 지점이 최적의 클러스터 K 가있는 부분임. 이 방법이 엘보우방법임.

inertia = []
for k in range(2,7):
    km = KMeans(n_clusters=k, n_init="auto", 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()

최적의 클러스터는 3인 것을 알 수 있음

 

'Python > 머신러닝+딥러닝 Ⅰ' 카테고리의 다른 글

비지도학습 : 군집 알고리즘 기본  (0) 2024.03.26
Ensemble Model  (0) 2024.03.25
교차검증  (1) 2024.03.22
Decision Tree(결정트리 알고리즘)  (0) 2024.03.22
확률적경사하강법  (1) 2024.03.22