반응형
주성분 분석(PCA)
머신러닝의 비지도 학습 핵심 알고리즘인'주성분분석'은 여러 개의 특성이 있는 데이터에서 주요한 특성을 뽑아내서 특성 개수를 줄이는 방법 이 알고리즘에는 복원 기능이 있다.
주요 역할
- 차원축소 :
- 주성분 분석 : 많은 특성을 사용하면 과대적합과 런타임이 늘어난다는 문제가 있는데 이를 예방해 준다.
이전에 사용했던 데이터를 불러와보자
#!wget https://bit.ly/fruits_300_data -O fruits_300.npy
import numpy as np
fruits = np.load('fruits_300.npy')
fruits_2d = fruits.reshape(-1, 100*100)
#PCA클래스의 객체를 만들때는 n_components 매개변수에 주성분 개수를 지정해야함/ 0.n은 전체를1 로 보고 비율로 개숫지정
from sklearn.decomposition import PCA
pca =PCA(n_components=50) # 50개의 주성분 추출
pca.fit(fruits_2d)
print(pca.components_.shape)
PCA는 주성분을 분석해 주는 클래스인데 이를 이용하면 데이터 안에서 지정한 수만큼 주성분을 추출해 준다.
추가로 앞서 만들었던 이미지 출력함수도 가져와보자
import matplotlib.pyplot as plt
# ratio 은 이미지의 배율
def draw_fruits(arr, ratio=1):
n =len(arr) # arr 는 입력된 샘플 수
# row : 행 , col : 열
# 한행에 10개씩 그림 그리기 위해 행 수 구하기
rows = int(np.ceil(n/10))
# np.ceil : 주어진 입력값보다 크거나 같은 최소 정수를 반환한다(올림)
# 다음을 해주는 이유는 91개의 데이터를 이미지로 출력하려면 10행이 필요하기때문
#행수가 1이면 n을 반환한하고 아니면 10
cols = n if rows ==1 else 10
fig, axs =plt.subplots(rows, cols, figsize=(cols*ratio, rows*ratio),squeeze=False)
# squeeze 1차원을 제거해주는 기능
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")
axs[i,j].axis('off')
# print("{}개 샘플 {}행 {}열".format(len(arr),rows,cols))
plt.show()
draw_fruits(pca.components_.reshape(-1,100,100))
#결과가 과일의 사진은 아닌데 비슷한 그림이 나옴 -> 주성분의 이미지
주성분이라는 것이 사람기준이 아닌 컴퓨터가 중요하다는 정보를 모은 것이기 때문에 원본가 어느 정도 괴리가 느껴진다.
이제 추출한 주성분을 원본 데이터에 적용을 하고 형태를 확인해 보면
# 주성분에 투영해서 원본 샘플 변환하기
#특성의 경향은 잘 유지하되, 데이터릐 용량을 줄여준다.
fruits_pca=pca.transform(fruits_2d)
fruits_pca.shape # 기존 fruits_2d는 (300,10000) 이였는데 (300,50)으로 크기가 작아짐
->
(300, 50)
확실히 데이터의 크기가 줄어든 것을 확인할 수 있다. 이렇게 데이터가 작아지면 처리속도가 빨라진다는 장점이 있다.
반대로 데이터의 손실을 피할 수 없어 복구할 때 데이터의 손실이 발생한다.
#원상복구 - 원상복구시 데이터의 손실이 발생한다
fruits_inverse = pca.inverse_transform(fruits_pca)
draw_fruits(fruits_inverse.reshape(-1,100,100)[:100])
이전에 봤던 사과 샘플보다 약간 흐릿해진 느낌이 든다.
반응형
'머신러닝' 카테고리의 다른 글
머신 러닝(with Google Colab) - 6일차(2) (0) | 2024.10.25 |
---|---|
머신 러닝(with Google Colab) - 6일차(1) (2) | 2024.10.21 |
머신 러닝(with Google Colab) - 5일차(3) (0) | 2024.10.18 |
머신 러닝(with Google Colab) - 5일차(2) (1) | 2024.10.18 |
머신 러닝(with Google Colab) - 5일차(1) (0) | 2024.10.17 |