2025년, 코딩은 선택이 아닌 필수!

2025년 모든 학교에서 코딩이 시작 됩니다. 먼저 준비하는 사람만이 기술을 선도해 갑니다~

강의자료/머신러닝

5.1 군집분석

원당컴1 2024. 7. 26. 09:29

https://wondangcom.tistory.com/2769

 

머신러닝 목차

머신러닝1. 머신러닝 소개1.1 인공지능이란(혼공머신) - 4차산업 혁명 시대에 꼭 필요한 인공지능에 대해 알아 보자.링크 :  https://wondangcom.tistory.com/2771(2024.3.7) 1.1 인공지능이란목표 4차 산업 혁

wondangcom.tistory.com

 

학습목표

  • 군집의 개념에 대한 이해
  • k-평균 알고리즘에 대한 이해

 

군집 분석(cluster analysis)이란

군집 분석은 데이터를 비슷한 특성을 가진 그룹으로 나누는 통계적 기법이다.

이를 통해 데이터를 더 잘 이해하고 패턴을 발견할 수 있다.

군집 분석은 다양한 분야에서 활용되며, 예를 들어 마케팅에서 유사한 고객 그룹을 찾거나 의학에서 환자 진단을 개선하는 데 사용된다.

군집 분석의 주요 원리는 거리 계산이다.

데이터 포인트 간의 거리를 측정하여 유사한 데이터를 같은 군집으로 묶는다.

이 때 몇개의 군집으로 나눌지 결정하는 것이 중요한데 이는 연구자의 경험과 직관에 의존한다.

군집 분석을 수행할 때 고려해야 할 설정은 다음과 같다.

  • 기준변수 : 어떤 변수를 기준으로 군집화 할 것인지
  • 거리 측정 방법 : 유클리디안 거리, 로그-우도 거리 등을 활용하여 거리 계산
  • 군집화 방법 : 최단 연결법, 평균연결법 등을 선택

 

군집 분석의 종류

  • 계층적 응집 군집화(Hierarchical Clustering) : 각 관측치를 하나의 최초 군집으로 지정한 후, 한 번에 두 개씩 하나의 군집으로 만들어, 모든 군집들이 하나의 군집이 될때 까지 군집들을 결합해 나가는 방법

참고 링크 - https://blog.naver.com/kyoungin90/222157362980

  • 분할적 군집화(Partitional Clustering) : 처음에 군집 수인 k를 지정한 후 관측지들을 무작위로 k개의 집단으로 분할 하고 다양한 기준(평균값,최빈값 등)을 이용하여 중심점을 수정해 나가며 집단을 다시 재 분류 하는 방법이다. 

 

K-평균 알고리즘

분할적 군집화 알고리즘으로 주어진 데이터를 k개의 클러스터로 묶는 알고리즘이다.

각 클러스터와 거리 차이의 분산을 최소화 하는 방식으로 동작한다.

출처: 위키백과

작동 방식은 다음과 같다.

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

K- 평균 알고리즘은 몇 가시 한계점을 가지고 있다.

  •   클러스터 개수 k 값을 입력 파라미터로 지정해 주어야 한다 : 5개의 클러스터를 가지고 있는데 8으로 입력 한다면 다음과 같이 좋지 못한 결과를 보여줄 가능성이 있다.

  • 알고리즘의 에러 수렴이 전역 최솟값이 아닌 지역 최솟값으로 수렴할 가능성이 있다.
  • 이상값(outlier)에 민감하다.
  • 구형(spherical)이 아닌 클러스터를 찾는 데는 적절하지 않다.

 

KMeans 클래스

K 평균 모델을 만들어 보자

1. 데이터 준비

데이터는 캐글 데이터셋을 활용한다.

https://www.kaggle.com/datasets/sshikamaru/fruit-recognition

 

Fruit Classification

22495 Images of Fruit!

www.kaggle.com

 

- Download 를 클릭하여 데이터를 다운로드 받은 후 압축된 파일을  해제하여 banana,Orange,Pinapple 세개의 폴더의 데이터를 하나의 폴더에 합쳐서 압축 하여 구글 드라이브에 업로드한다.(우리는 k평균으로 3개의 그룹을 분류하는 것을 연습할 예정이므로 각각의 이미지가 무엇인지 볼 필요가 없다.)

2. 데이터 로딩

2.1 구글드라이브 연결

# prompt: 구글 드라이브 연결해 줘

from google.colab import drive
drive.mount('/content/drive')

2.2 데이터 압축해제

# prompt: 구글드라이브 파일 카피 후 압축 해제

# Copy the file from Google Drive to the Colab instance.
!cp '/content/drive/MyDrive/dataset/Fruit.zip' .

# Unzip the file.
!unzip Fruit.zip -d "./data"

2.3 이미지 파일을 읽어서 넘파이 파일로 저장

# prompt: ./data 디렉토리에 있는 이미지 파일을 읽어서 numpy 파일로 변환 해 줘

import numpy as np
from PIL import Image
import os

# Get a list of all image files in the directory
image_files = os.listdir('./data')
# Create an empty list to store the images
images = []

# Loop through each image file and open it
for image_file in image_files:
  with Image.open(f"./data/{image_file}") as img:
    # Convert the image to a numpy array
    image_array = np.array(img)
    # Append the image array to the list
    images.append(image_array)

# Convert the list of images to a numpy array
images_array = np.array(images)

# Save the numpy array to a file
np.save("./data/images.npy", images_array)

2.4 넘파이 배열로 준비

fruits = np.load('./data/images.npy')
fruits.shape

100*100*3 형태의 이미지가 1461장이 있다.

이것을 흑백 사진으로 변경 후 100*100의 1차원을 10000짜리 1차원 데이터로 변환한다.

fruits_2d = fruits.reshape(-1, 100*100*3)
fruits_2d.shape

3. K-평균알고리즘 구현

K평균알고리즘은 sklearn.cluster 모듈 아래 구현이 되어 있다.

3.1 최적의 k 찾기

k-평균 알고리즘의 단점 중 하나는 클러스터 개수를 지정해야 한다는 것이다.

클러스터 개수를 찾기 위한 대표적인 방법이 엘보우(elbow) 방법이 있는데 클러스터 중심과 클러스터에 속한 샘플 사이의 거리의 제곱합(이너셔 라고 부른다.)을 관찰하여 최적의 클러스터 개수를 찾는 방법이다.

클러스터 개수를 증가시키면서 이너셔를 그래프로 그리면 감소하는 속도가 꺽이는 지점이 있다.

이 지점부터는 클러스터 개수를 늘려도 클러스터에 잘 밀집된 정도가 크게 개선 되지 않는다.

이 지점이 마치 팔꿈치 모양이어서 엘보우(elbow) 방법이라고 부른다.

# prompt: elbow 방법으로 k의 최적값을 찾는 코드 작성해 줘

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# Create an empty list to store the WCSS values
wcss = []

# Loop through a range of k values from 1 to 10
for k in range(2, 7):
  # Create a KMeans model with the current k value
  kmeans = KMeans(n_init=10,n_clusters=k)
  # Fit the model to the data
  kmeans.fit(fruits_2d)
  # Append the WCSS value to the list
  wcss.append(kmeans.inertia_)

# Plot the WCSS values against the k values
plt.plot(range(2, 7), wcss)
plt.xlabel("Number of clusters")
plt.ylabel("WCSS")
plt.title("Elbow Method")
plt.show()

k의 값을 2 부터 6 까지 순서대로 훈련한 다음 inertia_ 속성의 값을 출력해 보면 위와 같이 k=3의 위치에서 살짝 꺽이는 모양을 확인 할 수 있다.

k=3의 값을 넣고 훈련을 진행해 보자.

3.2 k평균 모델 훈련

km = KMeans(n_init=10,n_clusters=3)
km.fit(fruits_2d)

k평균의 매개 변수중 n_init은 초기 중앙점 초기화를 몇번 할 것인지에 대한 파라미터이다. 디폴트 값으로 10의 값이 설정되어 있다. n_clusters는 k의 갯수

3.3 k 평균으로 훈련된 클러스터 개수 확인

print(np.unique(km.labels_, return_counts=True))

3개의 클러스터로 구분했으니 당연히 라벨은 0,1,2 중 하나로 구분이 되었을 것이다.

3.4 각 클러스터의 이미지 출력

각각의 클러스터가 어떤 이미지를 나타냈는지 그림으로 출력하기 위해 draw_fruits 을 만들어 보자.

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 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()

draw_fruits 함수는 샘플개수,너비,높이 의 3차원 배열을 입력받아 가로로 10개씩 이미지를 출력한다. 샘플 개수에 따라 행과 열의 개수를 계산하고 figsize를 지정한다.

figsize는 ratio 매개변수에 비례하여 커진다.

이 함수를 사용하여 레이블이 0인 과일 사진을 모두 그려보자

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

오렌지로 분류가 잘 된 것을 확인 할 수 있다.

1인 분류의 과일 사진을 그려 보자.

파인애플로 분류 되었다. 

2인 분류의 과일 사진을 그려 보자.

바나나가 출력 되었다.

파인애플에서 바나나를 포함하기는 했지만 스스로 비슷한 샘플들을 모은 모습을 확인 할 수가 있다.

 

마무리

  • 비지도 학습의 대표적인 클러스터링 방법을 살펴 보았다.
  • 비지도 학습의 대표적인 알고리즘은 다음과 같다.
    • 군집화(Clustering) : 유사한 특성을 가진 데이터 그룹을 자동으로 분류하는 알고리즘으로 K-평균,계층적 군집분석(HCA), 밀도 기반 군집화 등이 있다.
    • 차원축소(Dimensionality Reduction) : 고차원 데이터의 복잡도를 줄여서 데이터 분석의 효율성을 높이는데 활용하는데 PCA 등이 있다.
    • 토픽 모델링(Topic Modeling) : 텍스트 데이터에서 주제를 추출하는 알고리즘으로 LDA가 대표적이다.
  • 비지도 학습은 레이블이 없는 데이터를 사용하며 데이터의 구조나 패턴을 찾는데 도움이 되지만 결과의 해석이 어려울 수 있고 레이블링 된 데이터가 있는 지도 학습보다 성능이 낮을 수 있다.

 

참고) 혼자 공부하는 머신러닝+딥러닝

 

 

#정보올림피아드

#검단신도시코딩

#원당동코딩

#마전동코딩

#왕길동코딩

#당하동코딩

#아라동코딩

#풍무동코딩

#불로동코딩

#검단동코딩

#검암동코딩

#학생부종합전형

 

 

사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기