지도 학습 방법으로 데이터셋의 차원 개수를 줄일 수 있는 선형 변환 기법
Fisher Discriminant Analysis (FDA) 라고도 한다.
공분산 개념을 통해 데이터를 잘 구분하는 특성을 선택한다.

데이터가 정규 분포를 따르며, 각 훈련 샘플은 서로 Independent 하다고 가정한다.
차원의 데이터셋을 표준화 한다.
각 클래스에 대해 차원의 평균 벡터를 계산한다. 
클래스 간의 Scatter matrix 와 클래스 내 Scatter matrix 를 구성한다.

행렬의 EigenVector 와 EigenValue를 계산한다.
고윳값을 내림차순으로 정렬하여 고유벡터의 순서를 매긴다.
고윳값이 가장 큰 개의 특성을 선택하여 x 의 변환 행렬 를 구성한다.
변환 행렬 를 이용하여 Projection matrix로 차원을 줄인다.




from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
# solver: 'eigen': 고유값 분해(Eigen decomposition) 방법을 사용.
# solver:'lsqr': 최소 제곱법(Least Squares) 방법을 사용.
lda = LDA(n_components=2, solver='eigen')
X_train_lda = lda.fit_transform(X_train_std, y_train)
# 클래스 내 공분산을 구할 때, 분모에 (n-1) 대신 n을 사용하기 위해 bias: True를 추가하였다.
class_scatter = np.cov(X_train_std[y_train==label].T, bias: True)
두 방법 모두 선형 변환 기법으로 차원의 개수를 줄이는 방법이다.

PCA가 데이터의 전체적인 분산을 최대화하는 방향으로 차원을 줄이는 반면, LDA는 클래스 간 분산을 최대화하는 방향으로 차원을 줄인다.
PCA는 비지도 학습, LDA는 지도 학습이라는 차이점이 있다.
분류 문제의 경우, LDA가 더 효율적이라는 연구 결과가 있다.