QDA(Quadratic Discriminant Analysis), 결정 함수, 사후 확률

김승혁·2024년 11월 25일

QDA(Quadratic Discriminant Analysis)는 데이터가 서로 다른 클래스에 속하는 것인지 판별하는 분류 알고리즘입니다. QDA는 각 클래스의 데이터가 정규 분포를 따른다고 가정하며, 각 클래스마다 서로 다른 공분산 행렬을 사용합니다. QDA는 선형이 아닌 이차 방정식(Quadratic)을 사용하여 결정 경계를 만들기 때문에, 클래스들 간의 분포가 선형으로 나눠지지 않을 때 유용합니다.

QDA의 수식

QDA의 기본 아이디어는 클래스마다 정규 분포를 따르는 확률 밀도 함수를 사용하는 것입니다. 클래스 CkC_k에 대해, 주어진 입력 벡터 x\mathbf{x}의 확률 밀도 함수는 다음과 같습니다:

P(xCk)=1(2π)d/2Σk1/2exp(12(xμk)TΣk1(xμk))P(\mathbf{x} | C_k) = \frac{1}{(2\pi)^{d/2} |\Sigma_k|^{1/2}} \exp\left( -\frac{1}{2} (\mathbf{x} - \mu_k)^T \Sigma_k^{-1} (\mathbf{x} - \mu_k) \right)

  • x\mathbf{x} : 입력 벡터
  • μk\mu_k : 클래스 CkC_k의 평균 벡터
  • Σk\Sigma_k : 클래스 CkC_k의 공분산 행렬
  • dd : 데이터의 차원
  • Σk|\Sigma_k| : 공분산 행렬의 행렬식
  • Σk1\Sigma_k^{-1} : 공분산 행렬의 역행렬

QDA의 결정 규칙

주어진 입력 x\mathbf{x}가 클래스 CkC_k에 속할 확률을 계산하고, 이를 최대화하는 클래스를 선택하는 방식입니다. 클래스 CkC_k에 속할 확률은 베이즈 정리를 사용하여 다음과 같이 구할 수 있습니다:

P(Ckx)P(xCk)P(Ck)P(C_k | \mathbf{x}) \propto P(\mathbf{x} | C_k) P(C_k)

  • P(Ck)=클래스 Ck에 속하는 샘플의 수전체 샘플의 수P(C_k) = \frac{\text{클래스 } C_k \text{에 속하는 샘플의 수}}{\text{전체 샘플의 수}}

    (클래스 CkC_k의 사전 확률)

  • P(xCk)P(\mathbf{x} | C_k): 클래스 CkC_k에 대한 조건부 확률 (위의 수식)

  • ABA \propto B라고 하면 "AABB에 비례한다"

  • 사후 확률은 조건부 확률과 사전 확률의 곱에 비례한다

결정 함수

결정 함수는 각 클래스의 사후 확률을 비교하여 가장 큰 확률을 갖는 클래스를 선택하는 방식입니다:

y^=argmaxkP(Ckx)=argmaxk(logP(xCk)+logP(Ck))\hat{y} = \arg\max_k P(C_k | \mathbf{x}) = \arg\max_k \left( \log P(\mathbf{x} | C_k) + \log P(C_k) \right)

숫자 예제

가장 간단한 예제로 두 클래스와 두 개의 특징을 가진 데이터를 사용하여 QDA를 적용해보겠습니다. 가정:

  • 클래스 1: μ1=[2,3]\mu_1 = [2, 3], 공분산 행렬 Σ1=[10.50.51]\Sigma_1 = \begin{bmatrix} 1 & 0.5 \\ 0.5 & 1 \end{bmatrix}

  • 클래스 2: μ2=[6,5]\mu_2 = [6, 5], 공분산 행렬 Σ2=[10.50.51]\Sigma_2 = \begin{bmatrix} 1 & -0.5 \\ -0.5 & 1 \end{bmatrix}

주어진 입력 x=[4,4]\mathbf{x} = [4, 4]에 대해 어떤 클래스를 예측할지 계산해봅니다.

  1. 클래스 1의 확률 밀도 함수 계산:

    P(xC1)=1(2π)1110.52exp(12(xμ1)TΣ11(xμ1))P(\mathbf{x} | C_1) = \frac{1}{(2\pi)^{1} \cdot \sqrt{1 \cdot 1 - 0.5^2}} \exp\left( -\frac{1}{2} \left( \mathbf{x} - \mu_1 \right)^T \Sigma_1^{-1} \left( \mathbf{x} - \mu_1 \right) \right)

  2. 클래스 2의 확률 밀도 함수 계산:

    P(xC2)=1(2π)111(0.5)2exp(12(xμ2)TΣ21(xμ2))P(\mathbf{x} | C_2) = \frac{1}{(2\pi)^{1} \cdot \sqrt{1 \cdot 1 - (-0.5)^2}} \exp\left( -\frac{1}{2} \left( \mathbf{x} - \mu_2 \right)^T \Sigma_2^{-1} \left( \mathbf{x} - \mu_2 \right) \right)

  3. 사후 확률 계산:

    P(C1x)P(xC1)P(C1)P(C_1 | \mathbf{x}) \propto P(\mathbf{x} | C_1) P(C_1)

    P(C2x)P(xC2)P(C2)P(C_2 | \mathbf{x}) \propto P(\mathbf{x} | C_2) P(C_2)

    로그를 취해서 비교:

    logP(C1x)logP(xC1)+logP(C1)\log P(C_1 | \mathbf{x}) \propto \log P(\mathbf{x} | C_1) + \log P(C_1)

    logP(C2x)logP(xCk)+logP(C2)\log P(C_2 | \mathbf{x}) \propto \log P(\mathbf{x} | C_k) + \log P(C_2)

  4. 확률이 높은 클래스를 예측값으로 선택.

이 방식으로 계산하여 x=[4,4]\mathbf{x} = [4, 4]가 클래스 1에 속하는지, 클래스 2에 속하는지 결정할 수 있습니다.

QDA는 각 클래스마다 개별적인 공분산 행렬을 고려하기 때문에 데이터가 선형적으로 분리되지 않는 경우에도 잘 작동합니다.










사후 확률의 로그 변환을 하는 이유



1. 지수 함수의 계산에서 발생하는 수치적 문제 해결

사후 확률을 계산할 때, 우리는 확률 밀도 함수를 포함한 식을 사용합니다. 대부분의 확률 밀도 함수는 지수 함수를 포함하고 있습니다. 예를 들어, QDA에서 클래스 CkC_k에 대해 주어진 데이터 x\mathbf{x}의 확률 밀도 함수는 다음과 같은 형태입니다:

P(xCk)=1(2π)d/2Σk1/2exp(12(xμk)TΣk1(xμk))P(\mathbf{x} | C_k) = \frac{1}{(2\pi)^{d/2} |\Sigma_k|^{1/2}} \exp\left( -\frac{1}{2} (\mathbf{x} - \mu_k)^T \Sigma_k^{-1} (\mathbf{x} - \mu_k) \right)

이와 같이, 지수 함수는 매우 빠르게 커지거나 작아지기 때문에 수치적으로 매우 큰 수나 작은 수를 다루게 될 수 있습니다. 컴퓨터에서 이러한 큰 수나 작은 수를 처리할 때, 오버플로우(overflow)나 언더플로우(underflow) 문제가 발생할 수 있습니다. 예를 들어, 확률 밀도가 너무 작으면 컴퓨터는 이를 처리할 수 없게 될 수 있습니다.

로그를 취하면 이러한 문제를 피할 수 있습니다. 왜냐하면, 지수 함수의 값을 로그로 바꾸면 큰 값들이 다루기 쉬운 수치로 변환되기 때문입니다. 예를 들어, 매우 작은 확률 값이 0에 가까워지지 않고, 그 대신 더 큰 수로 변환됩니다. 이는 계산을 보다 안정적으로 만들어 줍니다.

2. 곱셈을 덧셈으로 바꿀 수 있음

QDA에서 사후 확률을 계산할 때, 우리는 여러 개의 확률 값을 곱하는 형태로 계산하게 됩니다. 예를 들어, 사후 확률은 다음과 같이 계산됩니다:

P(Ckx)P(xCk)P(Ck)P(C_k | \mathbf{x}) \propto P(\mathbf{x} | C_k) P(C_k)

여기서 P(xCk)P(\mathbf{x} | C_k)P(Ck)P(C_k)는 각각 확률 밀도 함수와 사전 확률입니다. 확률 밀도 함수는 보통 매우 작은 값이기 때문에 곱셈을 하다 보면 결과값이 매우 작아집니다.

로그 변환을 사용하면 곱셈덧셈으로 바꿀 수 있습니다. 로그를 취한 후, 곱셈은 덧셈으로 변환되기 때문에 계산이 훨씬 간단하고 효율적입니다. 예를 들어, 다음과 같은 곱셈 관계가 있을 때:

P(Ckx)P(xCk)P(Ck)P(C_k | \mathbf{x}) \propto P(\mathbf{x} | C_k) P(C_k)

로그를 취하면:

logP(Ckx)logP(xCk)+logP(Ck)\log P(C_k | \mathbf{x}) \propto \log P(\mathbf{x} | C_k) + \log P(C_k)

이렇게 하면 곱셈 대신 덧셈으로 계산을 할 수 있기 때문에 계산이 더 간단하고 효율적입니다. 특히 많은 데이터 포인트와 클래스가 있을 때, 이는 매우 중요한 최적화 이점이 됩니다.

3. 수학적 표현의 단순화

사후 확률의 로그 변환을 사용하면 수학적으로 더 단순하게 표현할 수 있습니다. QDA에서 사후 확률을 비교할 때, 우리가 사용하는 수식은 다음과 같습니다:

P(Ckx)P(xCk)P(Ck)P(C_k | \mathbf{x}) \propto P(\mathbf{x} | C_k) P(C_k)

로그를 취하면:

logP(Ckx)logP(xCk)+logP(Ck)\log P(C_k | \mathbf{x}) \propto \log P(\mathbf{x} | C_k) + \log P(C_k)

이렇게 되면, 복잡한 확률 밀도 함수사전 확률을 곱하는 대신, 각 항목의 로그 값을 계산한 후 더하는 형태로 단순화됩니다. 이는 후속 계산을 더 빠르고 효율적으로 만들 수 있습니다.

4. 결정 경계를 쉽게 찾을 수 있음

QDA에서 결정 규칙은 각 클래스의 사후 확률을 비교하여 가장 큰 값을 선택하는 것입니다. 사후 확률은 다음과 같은 식으로 계산됩니다:

y^=argmaxkP(Ckx)\hat{y} = \arg\max_k P(C_k | \mathbf{x})

로그를 취한 후에는 로그 사후 확률을 비교하게 됩니다. 사후 확률을 비교하는 과정에서 로그 변환을 사용하면 계산이 더 간단해지고, 결정 경계를 쉽게 구할 수 있습니다.

예를 들어, 두 클래스 C1C_1C2C_2의 사후 확률이 같아지는 점에서 결정 경계가 형성됩니다:

P(C1x)=P(C2x)P(C_1 | \mathbf{x}) = P(C_2 | \mathbf{x})

로그 사후 확률을 사용하면:

logP(C1x)=logP(C2x)\log P(C_1 | \mathbf{x}) = \log P(C_2 | \mathbf{x})

이 식을 풀면 결정 경계는 이차 함수(quadratic function)로 표현되므로, 결정 경계를 찾는 것이 간단해집니다.

profile
열심히 사는 척

0개의 댓글