커널 밀도 추정

Beginner

This tutorial is from open-source community. Access the source code

소개

커널 밀도 추정 (KDE) 은 비모수적 밀도 추정 기법입니다. 이 실습에서는 KDE 를 사용하여 데이터의 새로운 샘플을 생성하는 방법을 배웁니다. scikit-learn 라이브러리를 사용하여 이 기법을 구현할 것입니다.

가상 머신 팁

가상 머신 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 Jupyter Notebook을 연습에 사용합니다.

때때로 Jupyter Notebook 이 로드되는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

데이터 로드

먼저, scikit-learn 에서 숫자 데이터셋을 로드합니다. 이 데이터셋에는 0 부터 9 까지의 숫자를 나타내는 8x8 이미지가 포함되어 있습니다. 주성분 분석 (PCA) 을 사용하여 데이터셋의 차원을 15 로 줄일 것입니다.

from sklearn.datasets import load_digits
from sklearn.decomposition import PCA

## 숫자 데이터셋 로드
digits = load_digits()

## PCA 를 사용하여 데이터셋의 차원을 15 로 줄임
pca = PCA(n_components=15, whiten=False)
data = pca.fit_transform(digits.data)

대역폭 최적화

KDE 의 대역폭 매개변수를 최적화하기 위해 그리드 검색 교차 검증을 사용합니다. 대역폭 매개변수는 밀도 추정의 매끄러움을 제어합니다.

from sklearn.neighbors import KernelDensity
from sklearn.model_selection import GridSearchCV
import numpy as np

## 그리드 검색 교차 검증을 사용하여 대역폭 최적화
params = {"bandwidth": np.logspace(-1, 1, 20)}
grid = GridSearchCV(KernelDensity(), params)
grid.fit(data)

print("최적 대역폭: {0}".format(grid.best_estimator_.bandwidth))

## 최적 추정자를 사용하여 커널 밀도 추정 계산
kde = grid.best_estimator_

새로운 샘플 생성

최적의 추정자를 사용하여 데이터에서 44 개의 새로운 점을 샘플링합니다. 그런 다음 PCA 의 역변환을 사용하여 새로운 데이터를 원래 64 차원으로 변환합니다.

## 데이터에서 44 개의 새로운 점을 샘플링
new_data = kde.sample(44, random_state=0)
new_data = pca.inverse_transform(new_data)

결과 플롯

원본 숫자와 재샘플링된 숫자를 4x11 그리드에 나란히 플롯합니다.

import matplotlib.pyplot as plt

## 데이터를 4x11 그리드로 변환
new_data = new_data.reshape((4, 11, -1))
real_data = digits.data[:44].reshape((4, 11, -1))

## 실제 숫자와 재샘플링된 숫자 플롯
fig, ax = plt.subplots(9, 11, subplot_kw=dict(xticks=[], yticks=[]))
for j in range(11):
    ax[4, j].set_visible(False)
    for i in range(4):
        im = ax[i, j].imshow(
            real_data[i, j].reshape((8, 8)), cmap=plt.cm.binary, interpolation="nearest"
        )
        im.set_clim(0, 16)
        im = ax[i + 5, j].imshow(
            new_data[i, j].reshape((8, 8)), cmap=plt.cm.binary, interpolation="nearest"
        )
        im.set_clim(0, 16)

ax[0, 5].set_title("입력 데이터에서 선택")
ax[5, 5].set_title("커널 밀도 모델에서 생성된 '새로운' 숫자")

plt.show()

요약

이 실험에서 커널 밀도 추정 (KDE) 을 사용하여 새로운 데이터 샘플을 생성하는 방법을 배웠습니다. Scikit-learn 라이브러리를 사용하여 이 기술을 구현했습니다. 그리드 검색 교차 검증을 사용하여 KDE 의 대역폭 매개변수를 최적화했습니다. 그런 다음 새로운 데이터 포인트를 샘플링하고 PCA 를 사용하여 원래 차원으로 변환했습니다. 마지막으로 원본 숫자와 재샘플링된 숫자를 4x11 그리드에 나란히 플롯했습니다.