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 |