2 min read

About LDA

선형판별분석(Linear Discriminant Analysis)

  • LDA : 데이터 분포를 학습해, 결정경계(Decision boundary)를 만들어 데이터를 분류하는 모델.

LDA의 배경, 목적

목적

LDA sample

  • 데이터를 특정 축에 사영(projection)한 후에, 두 범주를 잘 구분할 수 있는 직선을 찾는 것.

→ 두 범주를 잘 구분할 수 있는 직선이 생기기 위해선, 사영한 두 범주의 중심이 서로 멀고, 분산이 작아야 한다.

  • Hog와 같이 너무 많은 차원의 특징 벡터가 있을 때, 이에 대한 처리 리소스가 많아질 수 있기 때문에 LDA를 진행하고, 훈련을 시킨다.

LDA

투영 후 두 클래스 간 분산은 최대한 크게 가져가고, 클래스 내부의 분산은 최대한 작게 가져가는 방식을 사용한다.

  • 클래스 간 분산이 최대 : 클래스의 중심이 서로 멀어지도록 분류.
  • 클래스 내부의 분산이 최소 : 하나의 클래스끼리 오밀조밀하게 뭉쳐있다.

조건

LDA를 하기 위해선 몇가지 조건이 필요하다.

  1. 데이터가 정규 분포한다.
  2. 각각의 분류들은 동일한 공분산 행렬을 갖는다.
  3. 피처들은 통계적으로 상호 독립적이다.

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)코드 블럭을 주석해제시키면 된다.

  • 코드 실행 링크