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()
고유벡터 (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
일반적으로 실제 데이터 셋은 모든 데이터의 특성, 즉 차원이 고르게 분포되어 있지 않다. 필기체 숫자 데이터셋인 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 |