준비하는 대학생

[기계학습] 차원축소 - LDA 본문

Programming/Machine learning

[기계학습] 차원축소 - LDA

Bangii 2023. 6. 22. 17:22

LDA란?

LDA(Linear Discriminant Analysis)는 선형 판별 분석법으로 PCA와 비슷합니다.

LDA는 입력데이터의 차원을 축소하는 것이 PCA와 비슷하지만 LDA는 지도학습의 분류에 사용하기 쉽게 개별 클래스를 분별할 수 있는 기준을 최대한 유지하면서 축소합니다.

PCA는 데이터의 변동성이 가장 큰 축을 찾았다면 LDA는 데이터의 결정 클래스를 최대한으로 분리할 수 있는 축을 찾는 것입니다.

LDA는 특정 공간 내 클래스를 최대로 분리할 수 있는 축을 찾기 위해 클래스간 분산과 클래스 내부 분산의 비율을 최대화 하는 방식으로 차원을 축소합니다. 즉, 같은 클래스 끼리는 뭉쳐있고, 다른 클래스와의 거리를 최대화 하게 하여 분류하기 쉬운 차원으로 축소하는 것입니다.

LDA를 구하는 방법

  1. 클래스 내부와 클래스 간 분산 행렬을 구합니다. (두개의 행렬은 입력 데이터의 결정 값 클래스 별로 개별 종속변수의 평균 백터를 기반으로 함)
  2. 두 행렬을 고유백터로 분해합니다.

$$ S_W^TS_B = [e_1 ... e_n]\begin{bmatrix}\lambda_1 & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & \lambda_n \end{bmatrix}\begin{bmatrix}e_1^T \\ \vdots \\ e_n^T \end{bmatrix} \\ S_W : 클래스\ 내부\ 분산\ 행렬 \\ S_b:클래스\ 간\ 분산\ 행렬 $$

  1. 고유값이 가장 큰 순으로 K개(LDA에서 정한 차수)를 추출합니다.
  2. 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 데이터를 변환합니다.

예시 코드

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis 
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
import pandas as pd
import matplotlib.pyplot as plt

iris = load_iris()
iris_scaled = StandardScaler ().fit_transform(iris.data)

Ida = LinearDiscriminantAnalysis (n_components=2) 
Ida.fit(iris_scaled, iris.target)
iris_Ida= Ida. transform(iris_scaled)

Ida_columns = ['lda_component_1', 'lda_component_2']
irisDF_Ida = pd.DataFrame(iris_Ida, columns=Ida_columns)
irisDF_Ida['target'] = iris.target

markers = ['^', 's', 'o']

for i, marker in enumerate(markers):
    x_axis_data = irisDF_Ida[irisDF_Ida['target']==i]['lda_component_1']
    y_axis_data = irisDF_Ida[irisDF_Ida['target']==i]['lda_component_2']
    plt.scatter(x_axis_data, y_axis_data, marker=marker, label=iris.target_names[i])

plt.legend()
plt.xlabel('lda_component_1')
plt.ylabel('lda_component_2')
plt.show()

LDA로 변환된 iris 데이터를 확인해보면 클래스별로 군집화 되어있고 서로 떨어져 있는 것을 확인 할 수 있습니다.

Comments