여정의 기록

비지도 학습법, 주성분 분석, 오토 인코더 본문

공부중 .../딥러닝의통계적이해

비지도 학습법, 주성분 분석, 오토 인코더

Chelsey 2022. 12. 13. 16:16
728x90

비지도 학습법 Unsepervised learning

  • 기계 학습 종류
  • 데이터의 특징을 알아내는 목표
  • 차원축소, 밀도 추정, 군집 분석, 독립성 분석 등

확률 모형 기반 분석 아닌 것 (Geometry 이용해서 분석)

  • 주성분 분석
  • 군집 분석

확률 모형 기반 분석

  • 인자 분석
  • 밀도 추정 

 

심층 비지도 학습법 Deep unsupervised learning

  • 딥러닝 종류

확률 모형 기반 분석이 아닌 것

  • Auto Encoder
  • Deep clustering

확률 모형 기반

  • Generative Adversarial Network (GAN)
  • Variational Auto Encoder

 

주성분 분석

  • 차원 축소 기법
  • 변수의 수를 줄이는 탐색적 자료 분석의 과정
  • 변수 변환 feature transformation - 선형조합으로 새로운 변수 만듦 -> 변수 선택 feature selection 

PCA

  • 대표적 차원 축소 기법
  • 변수 변환에 기초
  • 원래 변수에 대한 선형 변환 -> 변수를 잘 설명하는 주성분 찾고 -> 데이터 차원 축소
  • 데이터 분산 최대한 보존 + 서로 직교하는 주성분 찾아야함
  • 주성분 변수의 유도 과정
    • 제1주성분은 표본 분산 행렬 S의 가장 큰 고유값 eigenvalue 과 대응되는 고유 벡터임,
      라그랑지안 방법을 이용
    • 제2주성분 : 제 1주성분과 직교 & Var(Xa) 를 최대화하는 기저 a 를 찾는 것이 목표.
      라그랑지안 방법을 이용, S의 두번째로 큰 고유값과 대응되는 고유 벡터임.
    • 제k주성분 = 표본 분산 행렬의 k번째로 큰 고유값과 대응되는 고유 벡터
  • 데이터를 가장 잘 설명하는 선형결합을 찾아야한다.
  • 선형결합은 가장 큰 분산을 가져야 한다.
  • 주성분 분석은 선형을 이용한 것이고 비선형 결합 중 가장 정보를 많이 포함하는 것을 찾기 위해 경험위험 최소화 관점을 보게된다.

경험 위험 최소화 관점

  • 데이터에서 변수간의 관계를 나타내는 함수 알아내기
  • 함수의 적합성을 손실 함수를 통해 수치화
  • 손실 함수의 합을 최소화하는 함수 선택
# MNIST module & PCA import
from keras.datasets import mnist
from sklearn.decomposition import PCA

# MNIST data load & return shape
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape[0], 28*28)
x_test = x_test.reshape(x_test.shape[0], 28*28)

# train data 이용해 주성분 찾기
# n_components : 추릴 주성분 개수
pca = PCA(n_components=10)
pca.fit(x_train)

# 10개의 주성분 그림으로 확인
import matplotlib.pyplot as plt

plt.figure(figsize=(15,3))
for i in range(10):
	plt.subplot(1, 10, i*1)
    plt.axis("off")
    plt.imshow(pca.components_[i].reshape(28,28), cmap="gray")
plt.show()

 

오토인코더

  • 차원축소
  • 비지도 학습 방법론
  • 비선형
  • 출력값이 입력값을 근사하도록 함
  • 인코딩 과정에서 입력된 데이터의 핵심 정보만 hidden layer 에서 학습하고 나머지 정보는 소실시킴
  • 디코딩 과정에서 hidden layer의 출력값을 뽑았을 때  완벽한 복사가 아닌 입력값의 근사치가 됨
  • 출력값이 입력값과 최대한 비슷해지도록 가중치 업데이트 학습
from keras.datsets import mnist
from kearas.layers import input, Dense
from keras.models import Sequential

(x_train, y_train) , (x_test, y_test) = mnist.load_data()
x_train=x_train.reshape(x_train.shape[0], 28*28)
x_test = x_test.reshape(x_test.shape[0], 28*28)
x_train = x_train.astype("float32")/255
x_test = x_test.astype("float32")/255 # 명도 , 각 픽셀을 [0,1]로 정규화

# Modeling
model = Sequential()
model.add(Dense(10, activation='relu')) # encoder , 10개의 hidden node.
model.add(784, activation='sigmoid')) # decoder
model.compile(loss="mean_squared_error", optimizer="adadelta") 
# optimizer 최적화 방법, 손실함수 제곱오차 이용

hist = model.fit(x_train, batch_size=200, epochs=50, verbose=1, validation_split=.05)
x_test_pred = model.predict(x_test)

 

728x90