머신러닝

High dimensional data, 차원 축소

ROSEV 2021. 7. 31. 19:03

Vector transformation

  •  선형 변환은 임의의 두 벡터를 더하거나 혹은 스칼라 값을 곱하는 것을 의미한다.
  • Linear Projection도 일종의 vector transformation이다.
  • Transformation은 matrix를 곱하는 것을 통해, 벡터(데이터)를 다른 위치로 옮긴다라는 의미를 가지고 있다.
import matplotlib.pyplot as plt
import numpy as np

input_vector = np.array([2, 4])

transform_matrix = np.array([[2, 1], [1, -3]])

output_vector = np.matmul(transform_matrix, input_vector)# [8, -10] 

print(output_vector)

plt.arrow(0, 0, input_vector[0], input_vector[1], head_width = .05, head_length = .05, color ='#d63031')
plt.arrow(0, 0, output_vector[0], output_vector[1], head_width = .05, head_length = .05, color ='#0984e3')
plt.xlim(0, 12)
plt.ylim(-10, 5)
plt.title("Transformed Vector")
plt.show()

 

output = [ 8, -10 ]

고유벡터 (Eigenvector)

  • R^3의 공간에서의 transformation
  • 지구를 예시로 보면, 특정 위치는 자전하면서 계속 바뀌지만 회전 축자체는 바뀌지 않는 것을 생각할 수 있다.
  • 이처럼 Transformation에 영향을 받지 않는 벡터를 고유 벡터라 한다. 

고유값(Eigenvalue)

  • 고유벡터는 크기만 변하고, 방향은 변화하지 않는 벡터임
  • 여기서 변화하는 크기는 결국 스칼라 값으로 변화 할 수 밖에 없으며, 이 특정 스칼라 값을 고유값(eigenvalue)라고 한다.
  • Eigenvector와 Eigenvalue는 항상 쌍을 이루고 있다

고차원의 문제(The curse of Dimensionality)

  • 속성의 수가 100개 혹은 1000천개 이상의 데이터 셋을 모델링하거나, 분석할 때 생기는 여러 문제점들을 의미한다.
  • 데이터 셋에서 정보를 찾기 위해 쓰이는 속성들이 모두 중요하지 않고, 어떤 것이 중요한 것이며 이를 통해 얼마나 의미 있는 결과를 찾아낼 수 있냐는 문제임(ex. 딥러닝 이미지 처리)
  • 또한 데이터의 양에 비해 속성이 많은 경우 과적합의 문제도 발생 그래서 필요한 것이 '차원 축소'

다차원일 수록 오버피팅되는 것을 볼 수 있다

 

차원  축소(Dimension Reduction)

  • 차원 축소 방법은 Feature Selection과 Feature Extraction이 있습니다.
  • Selection은 말그대로 4가지 속성이 있으면, 그 중 제일 다양하게 분포되어 있는 속성을 선택하는 것입니다. 이러한 과정을 통해 속성의 수를 줄이는 것을 말하며
  • Extraction은 기존에 있는 속성을 바탕으로 새로운 조합된 속성을 만드는 것을 말합니다.

 

PCA (주성분 분석)

  • 고차원 데이터를 효과적으로 분석하기 위한 기법
  • 낮은 차원으로 차원 축소
  • 고차원 데이터를 효과적으로 시각화 + 클러스터링
  • 원래 고차원 데이터의 정보를 최대한 유지하는 벡터를 찾고, 해당 벡터에 대해 데이터를 Projection

PCA의 단계

  • 학습 데이터셋에서 분산이 최대인 축(axis)을 찾는다
  • 이렇게 찾은 첫번째 축과 직교(orthogonal)하면서 분산이 최대인 두번째 축을 찾는다.
  • 첫번째 축과 두번째 축에 직교하고 분산을 최대한 보존하는 세번째 축을 찾는다
  • [1-3]번 같은 방법으로 데이터셋의 차원 만큼의 축을 찾는다.

 

 

from sklearn.preprocessing import StandardScaler, Normalizer
from sklearn.decomposition import PCA


X = np.array([
[0.2, 5.6, 3.56],
[0.45, 5.89, 2.4],
[0.33, 6.37, 1.95],
[0.54, 7.9, 1.32],
[0.77, 7.87, 0.98]
])

print("Data: \n", X)

scaler = StandardScaler()

Z = scaler.fit_transform(X)

print("\n Standardized Data: \n", Z)

pca = PCA(2)

pca.fit(X)

print("\n Eigenvectors: \n", pca.components_)

print("\n Eigenvalues: \n",pca.explained_variance_)

B = pca.transform(X)

print("\n Projected Data: \n", B)

 

 

[output]

Data: 
 [[0.2  5.6  3.56]
 [0.45 5.89 2.4 ]
 [0.33 6.37 1.95]
 [0.54 7.9  1.32]
 [0.77 7.87 0.98]]

 Standardized Data: 
 [[-1.33380097 -1.15155802  1.67838223]
 [-0.04135817 -0.85497558  0.395824  ]
 [-0.66173071 -0.36408051 -0.10172014]
 [ 0.42392124  1.20064752 -0.79828193]
 [ 1.61296861  1.16996658 -1.17420417]]

 Eigenvectors: 
 [[-0.13020816 -0.73000041  0.67092863]
 [-0.08905388  0.68256517  0.72537866]]

 Eigenvalues: 
 [2.15851707 0.09625196]

 Projected Data: 
 [[ 1.87404384  0.35553233]
 [ 0.85151446 -0.31022649]
 [ 0.21482136 -0.29832914]
 [-1.35210803  0.27030569]
 [-1.58827163 -0.0172824 ]]

 


Projection

 

Projection의 좋은 예시

일반적으로 실제 데이터 셋은 모든 데이터의 특성, 즉 차원이 고르게 분포되어 있지 않다. 필기체 숫자 데이터셋인 MNIST로 예를 들면 각 어떤 특성은 거의 변화가 없고, 또 어떤 특성을 다른 특성들과 서로 연관되어 있다. 이렇듯 학습 데이터셋은 고차원 공간에서 저차원 부분공간에 위치하게 된다. 즉 고차원의 데이터의 특성중 일부 특성으로 데이터를 표현할 수 있다는 말이 된다.

 

 

 

 

'머신러닝' 카테고리의 다른 글

다중선형회귀( Multiple Linear Regression)  (0) 2021.08.03
단순선형회귀( Simple-Regression )  (0) 2021.08.02
Clustering  (0) 2021.07.31
Feature Engineering, Data Manipulation  (0) 2021.07.15
EDA  (0) 2021.07.15