커널 밀도 추정(Kernel Density Estimation, KDE)

2021. 4. 12. 23:07머신러닝

반응형

Kernel density estimation은 unsupervised learning으로, 밀도 추정 방법 중에 하나입니다. 우리가 가장 흔히 알고 있는 밀도 추정 방법 중에 하는 히스토그램입니다. 다만 히스토그램은 각 계급간 불연속적 이고 계급의 크기나 시작위치에 따라 형태가 쉽게 달라지는 단점이 있습니다.

KDE는 말그대로 Kernel을 활용하는 것으로 Kernel Regression본 것과 같이 연속적입니다. 따라서 부드러운 밀도 함수를 도출해낼 수 있습니다.

KDE에서 분포를 찾아가는 과정은 아래와 같습니다.

Kernel Regression에서 Kernel을 활용한 기본적인 개념은 나(기준)와 가까운 것에 가중치를 주는 것이였습니다. KDE에서도 마찬가지입니다. $x_0$이 있다고 가정해보면 $x_0$근처에 데이터 Point들이 몰려있다면, $x_0$의 밀도값이 높게 추정되는 것은 당연할 것입니다.

$x_0$에서 KDE 밀도 추정 값은 아래와 같습니다.

$x_0$과 모든 Data point들의 Kernel function의 합을 Point들 수로 나눈 것입니다.

이를 x로 일반화 화면($x_0$를 x로 바꾸어주면) 간단히 아래와 같이 됩니다.

이는 각 Point에서 그려진 Kernel 함수(분포)의 합으로 나타낼 수 있는데, 아래 블로그에  잘 정리되어 있습니다.

yenaworldblog.wordpress.com/2019/01/08/kernel-density-estimation-kde-%EC%9D%B4%ED%95%B4/

간단히 Python을 활용하여 KDE를 추정해보고 Histogram과 비교해보겠습니다. 코드는 아래 싸이트를 참고하였습니다.

jakevdp.github.io/PythonDataScienceHandbook/05.13-kernel-density-estimation.html

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

def make_data(N, f=0.3, rseed=1):
    rand = np.random.RandomState(rseed)
    x = rand.randn(N)
    x[int(f * N):] += 5
    return x

x = make_data(1000)
hist = plt.hist(x, bins=30, density = True)

from sklearn.neighbors import KernelDensity

# instantiate and fit the KDE model
kde = KernelDensity(bandwidth=1.0, kernel='gaussian')
kde.fit(x[:, None])

# score_samples returns the log of the probability density
x_d = np.linspace(-4, 8, 1000)
logprob = kde.score_samples(x_d[:, None])

plt.fill_between(x_d, np.exp(logprob), alpha=0.5)
plt.plot(x, np.full_like(x, -0.01), '|k', markeredgewidth=1)
plt.ylim(-0.02, 0.22)

 

반응형

'머신러닝' 카테고리의 다른 글

모델 평가 및 선정 > Bias, Variance  (0) 2021.05.06
커널 밀도 추정 기반 Classification  (0) 2021.04.19
KRR(Kernel Ridge Regression)  (0) 2021.03.23
Kernel Regression  (0) 2021.03.23
Smoothing Spline  (0) 2021.03.12