선형 판별 분석(Linear Discriminant Analysis, LDA) > 차원축소

2021. 2. 22. 23:46머신러닝

반응형

LDA는 Classification뿐만 아니라 차원축소에서도 활발히 활용되고 있는 방법론입니다. LDA는 Class가 존재할 때 Class가 최대한 잘 분리되도록 Discriminant direction을 찾아서 Projection을 하는 방법입니다. 

LDA를 활용한 차원축소의 사상은 같은 Class들의 데이터는 분산이 최소화되고 다른 Class간에는 분산이 최대화 되도록합니다. 다시 말하면 같은 Class끼리는 붙어 있게 다른 Class간에는 멀리 떨어져 있는 Vector를 찾아서 거기에 데이터들을 Projection하는 것입니다.

The Element of Statistical Learning

오른쪽에 그림과 같이 Class가 잘 구분되도록 Projection을 하는 것입니다.

먼저 Class가 2개인 경우에 어떻게 discriminant direction을 도출하는지에 대해서 정리하도록 하겠습니다. 위에서 설명한 것처럼 Class내 분산과 Class간 분산을 도출하여 projection할 vector를 찾도록 하겠습니다.

Class내 분산(Within 분산)은 아래와 같습니다.

이 때 $W$가 우리가 찾아야할 vector입니다.

Class간 분산(Between 분산)은 아래와 같습니다.

우리는 $\sigma^2_{within}$을 최소화하고 $\sigma^2_{between}$를 최대화 하고자 하기 때문에 최대화를 위한 목적함수는 아래와 같이 정의됩니다.

이제 위 식을 Multiclass문제로 확장해보면 아래와 같이 표현할 수 있습니다.

최대화를 위해 위 목적함수 $J(W)$를 미분하여 0이 되는 값을 찾게되면 다음과 같이 정리 됩니다.

이를 목적함수 $J$로 나타내면 다음과 같습니다.

위식을 보면 이제 이는 우리가 찾고자 하는 vector $W$는 $S^{-1}_wS_B$의 eigenvector가 됩니다. 따라서 해당 벡터의 고유벡터를 찾는다면 우리는 차원축소를 위해 Projection을 할 vector를 찾을 수 있게 됩니다.

Vector $W$를 찾게되면 Input X와 dot product를 통해 input X를 vector W에 projection을 하면 차원축소를 할 수 있게 됩니다.

Python을 통해 실습해보도록 하겠습니다.

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.metrics import confusion_matrix
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

##데이터
iris = load_iris()
iris

## 차원축소
lda = LinearDiscriminantAnalysis(n_components=2)
X_reduced = lda.fit_transform(iris.data, iris.target)

## 시각화
df=pd.DataFrame(np.column_stack([X_reduced ,iris.target]), columns =["X1","X2","class"])

plt.scatter(df.loc[df["class"] == 0]["X1"],df.loc[df["class"] == 0]["X2"], color = 'r', label="setosa")
plt.scatter(df.loc[df["class"] == 1]["X1"],df.loc[df["class"] == 1]["X2"], color = 'g', label="versicolor")
plt.scatter(df.loc[df["class"] == 2]["X1"],df.loc[df["class"] == 2]["X2"], color = 'b', label ="virginica")
plt.legend()
plt.show()

반응형