Programming/Machine learning
[기계학습] 차원축소 - LDA
Bangii
2023. 6. 22. 17:22
LDA란?
LDA(Linear Discriminant Analysis)는 선형 판별 분석법으로 PCA와 비슷합니다.
LDA는 입력데이터의 차원을 축소하는 것이 PCA와 비슷하지만 LDA는 지도학습의 분류에 사용하기 쉽게 개별 클래스를 분별할 수 있는 기준을 최대한 유지하면서 축소합니다.
PCA는 데이터의 변동성이 가장 큰 축을 찾았다면 LDA는 데이터의 결정 클래스를 최대한으로 분리할 수 있는 축을 찾는 것입니다.
LDA는 특정 공간 내 클래스를 최대로 분리할 수 있는 축을 찾기 위해 클래스간 분산과 클래스 내부 분산의 비율을 최대화 하는 방식으로 차원을 축소합니다. 즉, 같은 클래스 끼리는 뭉쳐있고, 다른 클래스와의 거리를 최대화 하게 하여 분류하기 쉬운 차원으로 축소하는 것입니다.
LDA를 구하는 방법
- 클래스 내부와 클래스 간 분산 행렬을 구합니다. (두개의 행렬은 입력 데이터의 결정 값 클래스 별로 개별 종속변수의 평균 백터를 기반으로 함)
- 두 행렬을 고유백터로 분해합니다.
$$ 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:클래스\ 간\ 분산\ 행렬 $$
- 고유값이 가장 큰 순으로 K개(LDA에서 정한 차수)를 추출합니다.
- 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 데이터를 변환합니다.
예시 코드
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 데이터를 확인해보면 클래스별로 군집화 되어있고 서로 떨어져 있는 것을 확인 할 수 있습니다.