본문 바로가기
AI/관련 자료

[머신러닝] 차원 축소와 주성분 분석

by 뒹굴거리는프로도 2024. 11. 11.
반응형

 


 

비지도 학습의 차원 축소


비지도 학습에서의 차원 축소는 레이블이 없는 데이터의 특성(feature) 수를 줄이는 과정입니다. 이 방법은 주로 데이터의 가장 중요한 정보는 유지하면서 계산 복잡성을 줄이고, 과적합을 방지하며, 데이터의 시각화를 용이하게 하는 데 도움을 줍니다. 차원 축소는 데이터의 내재된 구조를 파악하는 데 유용하며, 여러 기법이 있지만 가장 널리 사용되는 기법은 주성분 분석(PCA), t-SNE, 그리고 LDA(Linear Discriminant Analysis) 등입니다.

 

비지도 학습의 차원 축소 예시: 고객 데이터 시각화


고객 데이터에는 다양한 속성(예: 연령, 소득, 구매 횟수 등)이 포함되어 있을 수 있습니다. 이러한 데이터는 차원이 많아 직접적인 시각화가 어렵습니다. 차원 축소 기법을 사용하여 가장 정보가 풍부한 몇 개의 차원으로 데이터를 압축하면, 고객 그룹 간의 관계를 2D 또는 3D 공간에 시각화하여 더 쉽게 이해할 수 있습니다. 예를 들어, t-SNE 기법을 사용하면 비슷한 구매 패턴을 가진 고객들이 시각적으로 군집화되어 나타납니다.


 

주성분 분석(PCA)


주성분 분석(Principal Component Analysis, PCA)은 특성의 수를 줄이면서 데이터에 포함된 분산을 최대한 보존하려는 비지도 학습 방법입니다. PCA는 고차원 데이터에 대한 통계적 접근 방식을 통해 데이터의 주요 특성을 추출하며, 다음과 같은 단계로 이루어집니다:

  1. 정규화: 각 특성의 평균을 0, 표준편차를 1로 맞추어 데이터를 정규화합니다.
  2. 공분산 행렬 계산: 데이터의 공분산 행렬을 계산합니다. 이 행렬은 특성 간의 분산을 나타냅니다.
  3. 고유값 분해: 공분산 행렬의 고유값과 고유벡터를 계산합니다. 고유벡터는 데이터 분산의 방향을 나타내고, 고유값은 그 방향의 중요도를 나타냅니다.
  4. 주성분 선택: 가장 큰 고유값을 갖는 고유벡터를 선택합니다. 이 고유벡터들은 데이터의 주요 특성을 나타내며, 여기서 선택된 벡터의 수는 새로운 차원의 수가 됩니다.
  5. 투영: 원래 데이터를 선택된 고유벡터들로 투영함으로써 차원을 축소합니다.

PCA는 특히 데이터의 시각화, 노이즈 제거, 데이터 압축 등에 유용하게 사용됩니다. 예를 들어, 이미지 처리에서 PCA를 사용하여 원본 이미지의 픽셀 수를 줄이면서 중요한 시각적 특성을 유지할 수 있습니다.

차원 축소 기법은 다양한 분야에서 유용하게 사용되며, 데이터의 복잡성을 줄이고, 중요한 정보를 보다 명확하게 파악할 수 있게 도와줍니다. 주성분 분석은 이러한 방법 중 하나로, 많은 데이터 과학자와 기계 학습 엔지니어에게 필수적인 도구로 자리잡고 있습니다.

 

주성분 분석(PCA) 예시: 얼굴 이미지 데이터의 차원 축소


얼굴 인식 시스템에서 PCA를 사용하여 이미지 데이터의 차원을 줄일 수 있습니다. 이러한 기법을 종종 "Eigenfaces"라고 부르며, 얼굴 이미지 집합에서 주요 특성을 추출하여 얼굴 인식의 정확도를 높입니다. 각 이미지를 데이터 포인트로 처리하고, PCA를 적용하여 원래 이미지 데이터보다 훨씬 적은 수의 차원을 사용하여 대부분의 분산을 유지합니다. 결과적으로, PCA는 원본 이미지에서 중요한 정보를 유지하면서 이미지를 잘 압축합니다.

import numpy as np
from sklearn.decomposition import PCA
from sklearn.datasets import fetch_olivetti_faces
import matplotlib.pyplot as plt

# 데이터 로드
data = fetch_olivetti_faces()
faces = data.images

# 이미지 형태 조정
n_samples, h, w = faces.shape
X = faces.reshape(n_samples, h * w)

# PCA 모델 생성 및 학습 (주성분 수 150)
n_components = 150
pca = PCA(n_components=n_components, whiten=True)
X_pca = pca.fit_transform(X)

# 원본 이미지와 PCA 적용 후의 이미지 비교
def plot_gallery(images, titles, h, w, n_row=3, n_col=4):
    plt.figure(figsize=(1.8 * n_col, 2.4 * n_row))
    plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.35)
    for i in range(n_row * n_col):
        plt.subplot(n_row, n_col, i + 1)
        plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray)
        plt.title(titles[i], size=12)
        plt.xticks(())
        plt.yticks(())

# 이미지 타이틀
image_titles = [f"PC {i+1}" for i in range(n_components)]

# 이미지 출력
plot_gallery(pca.components_, image_titles, h, w)

이 코드는 PCA를 사용하여 얼굴 이미지의 차원을 축소하고, 결과적으로 얻어진 주성분(주요 특성)을 시각화하는 방법을 보여줍니다. 이를 통해 데이터의 가장 중요한 변동 요소를 확인할 수 있으며, 이는 보다 효과적인 특성 추출과 데이터 압축을 가능하게 합니다.

 


 

반응형