선형판별분석(Linear Discriminant Analysis)
- LDA : 데이터 분포를 학습해, 결정경계(Decision boundary)를 만들어 데이터를 분류하는 모델.
LDA의 배경, 목적
목적
- 데이터를 특정 축에 사영(projection)한 후에, 두 범주를 잘 구분할 수 있는 직선을 찾는 것.
→ 두 범주를 잘 구분할 수 있는 직선이 생기기 위해선, 사영한 두 범주의 중심이 서로 멀고, 분산이 작아야 한다.
- Hog와 같이 너무 많은 차원의 특징 벡터가 있을 때, 이에 대한 처리 리소스가 많아질 수 있기 때문에 LDA를 진행하고, 훈련을 시킨다.
LDA
투영 후 두 클래스 간 분산은 최대한 크게 가져가고, 클래스 내부의 분산은 최대한 작게 가져가는 방식을 사용한다.
- 클래스 간 분산이 최대 : 클래스의 중심이 서로 멀어지도록 분류.
- 클래스 내부의 분산이 최소 : 하나의 클래스끼리 오밀조밀하게 뭉쳐있다.
조건
LDA를 하기 위해선 몇가지 조건이 필요하다.
- 데이터가 정규 분포한다.
- 각각의 분류들은 동일한 공분산 행렬을 갖는다.
- 피처들은 통계적으로 상호 독립적이다.
LDA 사용
- python의 sklearn 패키지를 통해 사용할 수 있다. (예시 코드)
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
def fit_LDA(data, target, n_components):
# fit data by StandardScaler
# n_components : the number of dimension that you want to reduce
data_scaled = StandardScaler().fit_transform(data)
lda = LinearDiscriminantAnalysis(n_components=n_components)
# fit()호출 시 target값 입력
lda.fit(data_scaled, target)
data_lda = lda.transform(data_scaled)
return data_lda
# for test
dataset = load_iris()
iris_lda = fit_LDA(dataset.data, dataset.target, 1)
print(dataset.data[0])
print(len(dataset.data))
[5.1 3.5 1.4 0.2]
150
print(iris_lda[0])
print(len(iris_lda))
[8.06179978]
150
-
아래 링크를 통해, 위 코드가 출력된 결과를 실행해볼 수 있다.(패키지 설치가 선행되어야 하기 때문에 1분 내외의 시간이 걸릴 수 있다.)
-
원래의 Iris dataset을 출력하기 위해선 주석처리된
# print(dataset.data)
코드 블럭을 주석해제시키면 된다.