데이터 한 그릇

차원축소(LDA, SVD,NMF) 본문

머신러닝/차원 축소

차원축소(LDA, SVD,NMF)

장사이언스 2021. 5. 12. 17:25
  • LDA
  • LDA 실습
  • SVD
  • SVD 실습
  • NMF
  • NMF 실습

LDA

 

  LDA(Linear Discriminant Analysis)는 선형 판별 분석법으로 불린다. PCA와 매우 유사하지만 PCA같은 경우 데이터의 변동성이 가장 큰 벡터를 찾았지만 LDA같은 경우에는 타겟 데이터를 잘 분류하기 위해서 결정 값들을 최대한 분류할 수 있는 벡터를 찾는다.

 

  LDA는 특정 공간상에서 결정 값을 분리하는 것을 최대화 하기 위해, 클래스 간 분산(between-class-scatter)과 클래스 내부 분산(within-class-scatter)의 비율을 최대화하는 방식으로 벡터를 찾는다. 비율을 최대화 하기 위해서는 클래스 간 분산을 최대화 시키고 클래스 내부 분산을 최소화 시키면 된다. 

 

  결국 LDA는 PCA와 달리 데이터의 변동성이 큰 축을 찾는 것이 아니라 타겟 데이터의 클래스 값들을 최대한 분류할 수 있는 벡터선을 찾는 차원축소 법이며, 최대한 분류를 잘 수행하기 위해서 클래스 간 분산을 최대화하고 클래스 내부 분산을 최소화 한다.

 


LDA 실습

 

 

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

iris = load_iris()
iris_df = pd.DataFrame(iris.data, columns = iris.feature_names)
iris_df['target'] = iris.target

 

  아이리스 데이터를 데이터 프레임화하여 불러온다.

 

scale = StandardScaler()
scaled_iris = scale.fit_transform(iris_df.iloc[:,:-1])

 

  앞서 pca 또한 데이터를 스케일화 해야 했다. lda 또한 마찬가지

 

Lda = LinearDiscriminantAnalysis(n_components = 2)
iris_lda = Lda.fit_transform(scaled_iris, iris_df['target'])
print(iris_lda.shape)

 

  피처를 두 개로 줄이는 것을 목표로 하여 n_components=2로 설정한다. 그리고 클래스 결정 값을 최대한 잘 분리할 수 있는 벡터를 찾는 것이기 때문에 타겟 데이터도 학습시 넣어주어야 한다.

 

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

lda_columns = ['lda_component1', 'lda_component2']
lda_df = pd.DataFrame(iris_lda, columns = lda_columns)
lda_df['target'] = iris.target

  결과 값을 시각화 하기 이해서 축소된 피처 두 개의 이름을 임의로 지어준다.

 

#세토사는 세모, 버지컬러는 네모 버지니카는 동그라미
markers = ['^','s','o']

for i,marker in enumerate(markers):
    x_axis_data = lda_df[lda_df['target']==i]['lda_component1']
    y_axis_data = lda_df[lda_df['target']==i]['lda_component2']
    
    plt.scatter(x_axis_data, y_axis_data, marker = marker, label = iris.target_names[i])
    

plt.legend()
plt.xlabel('lda_component1')
plt.ylabel('lda_component2')
plt.show()

 

  x축과 y축의 데이터는 축소된 피처들의 값들이여야 한다. 따라서 각 타겟 데이터 별 각 피처의 데이터를 가져온다.

 

LDA 결과 그래프

 


SVD ~ NMF

 

SVD 또한 PCA와 유사한 차원 축소 기법이라고 할 수 있다. 하지만 가장 큰 차이점 또한 존재하는데, PCA는 정방 행렬에만 사용되는 반면에 SVD는 행과 열의 개수가 달라도 사용이 될 수 있다. 일반적으로  SVD는 m x n 크기의 행렬 A를 다음과 같이 분해하는 것을 의미한다.

 

$$A = U\sum V^{T}$$

 

 

 

@@선형대수를 할 줄을 모르니 선형대수를 공부하고 이 부분을 보충하도록 하겠다.@@

 

 

'머신러닝 > 차원 축소' 카테고리의 다른 글

차원 축소 개요와 PCA개요  (0) 2021.05.06
Comments