728x90
반응형
KDE(Kernel Density Estimation)의 이해
seaborn의 distplot()을 이용하여 KDE 시각화
https://seaborn.pydata.org/tutorial/distributions.html
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
sns.set(color_codes=True)
np.random.seed(0)
x = np.random.normal(0, 1, size=30)
print(x)
sns.distplot(x);
# HIST 막대그램, KDE 분포그래프 RUG 밀집도
[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799 -0.97727788
0.95008842 -0.15135721 -0.10321885 0.4105985 0.14404357 1.45427351
0.76103773 0.12167502 0.44386323 0.33367433 1.49407907 -0.20515826
0.3130677 -0.85409574 -2.55298982 0.6536186 0.8644362 -0.74216502
2.26975462 -1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]
sns.distplot(x, rug=True)
sns.distplot(x, kde=False, rug=True)
sns.distplot(x, hist=False, rug=True);
개별 관측데이터에 대해 가우시안 커널 함수를 적용
from scipy import stats
#x = np.random.normal(0, 1, size=30) # 샘플데이터
bandwidth = 1.06 * x.std() * x.size ** (-1 / 5.) # 커널함수 만들기
support = np.linspace(-4, 4, 200) # -4~4까지 200개로 촘촘히 표현
kernels = []
for x_i in x:
kernel = stats.norm(x_i, bandwidth).pdf(support)
kernels.append(kernel) # 커널함수를 각각 그릴것
plt.plot(support, kernel, color="r")
sns.rugplot(x, color=".2", linewidth=3);
from scipy.integrate import trapz
density = np.sum(kernels, axis=0)
density /= trapz(density, support)
plt.plot(support, density);
seaborn은 kdeplot()으로 kde곡선을 바로 구할 수 있음
sns.kdeplot(x, shade=True);
bandwidth에 따른 KDE 변화
sns.kdeplot(x)
sns.kdeplot(x, bw=.2, label="bw: 0.2") # 작고
sns.kdeplot(x, bw=2, label="bw: 2") # 크게
plt.legend();
반응형
'Data_Science > ML_Perfect_Guide' 카테고리의 다른 글
7-7. Gaussian_Mixture_Model (0) | 2021.12.30 |
---|---|
7-6. Mean_Shift (0) | 2021.12.30 |
7-3. Cluster_evaluation || 실루엣 계수 (0) | 2021.12.30 |
7-2. Kmeans 2 (0) | 2021.12.29 |
7-1. Kmeans (0) | 2021.12.29 |