파이썬에서 커널 밀도 추정
7672 단어 matplotlib파이썬scipynumpy
커널 밀도 추정(Kernel Density Estimation: KDE)이란?
Wikipedia 당 참고 바랍니다.
상황에 따라 (데이터 수가 많고 부드러운 분포 함수를 따르는 등) 히스토그램보다 데이터의 개요를 파악할 수 있습니다.
적당한 데이터 만들기
우선은 필요한 패키지를 읽어, 정규 분포를 거듭한 쌍봉성의 데이터 세트를 5개 정도 만듭니다.
import numpy as np
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
N = 5
means = np.random.randn(N,2) * 10 + np.array([100, 200])
stdev = np.random.randn(N,2) * 10 + 30
count = np.int64(np.int64(np.random.randn(N,2) * 10000 + 50000))
a = [
np.hstack([
np.random.randn(count[i,j]) * stdev[i,j] + means[i,j]
for j in range(2)])
for i in range(N)]
데이터로부터 분포를 추정하여 그래프를 작성한다.
터무니없는 이상치가 있으면 귀찮기 때문에 0.1%에서 99.9%까지의 백분위점에서 데이터를 잘라 버립니다.
(여담입니다만 numpy에서는 percentile(array, x)
로 0..100의 범위로 지정인데, pandas에서는 Series.quantile(x)
로 0..1로 지정입니다.
계속해서 scipy.stats.gaussian_kde()
에 데이터를 건네주면, 가우시안 커널에서 추정된 밀도 함수를 돌려주므로 numpy.linspace
와 조합하면 바삭바삭하게 플롯할 수 있습니다.
limmin = min(np.percentile(x, 0.1) for x in a)
limmax = max(np.percentile(x, 99.9) for x in a)
ls = np.linspace(limmin, limmax, 100)
for n in range(N):
x = a[n]
x = x[(x > limmin)&(x < limmax)]
kde = gaussian_kde(x)
plt.plot(ls, kde(ls), label='data %d' % n)
plt.xlim([limmin, limmax])
plt.legend()
plt.title('data distributions')
plt.show()
kde 객체의 resample()
메소드라든지 사용하면, 측정 데이터에 가까운 분포의 시뮬레이션용의 데이터 생성이라든지 뿌리 합니다. 자세한 내용은 공식 문서 에서.
Reference
이 문제에 관하여(파이썬에서 커널 밀도 추정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/s-wakaba/items/6ae75e326888c6a962ad
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
우선은 필요한 패키지를 읽어, 정규 분포를 거듭한 쌍봉성의 데이터 세트를 5개 정도 만듭니다.
import numpy as np
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
N = 5
means = np.random.randn(N,2) * 10 + np.array([100, 200])
stdev = np.random.randn(N,2) * 10 + 30
count = np.int64(np.int64(np.random.randn(N,2) * 10000 + 50000))
a = [
np.hstack([
np.random.randn(count[i,j]) * stdev[i,j] + means[i,j]
for j in range(2)])
for i in range(N)]
데이터로부터 분포를 추정하여 그래프를 작성한다.
터무니없는 이상치가 있으면 귀찮기 때문에 0.1%에서 99.9%까지의 백분위점에서 데이터를 잘라 버립니다.
(여담입니다만 numpy에서는 percentile(array, x)
로 0..100의 범위로 지정인데, pandas에서는 Series.quantile(x)
로 0..1로 지정입니다.
계속해서 scipy.stats.gaussian_kde()
에 데이터를 건네주면, 가우시안 커널에서 추정된 밀도 함수를 돌려주므로 numpy.linspace
와 조합하면 바삭바삭하게 플롯할 수 있습니다.
limmin = min(np.percentile(x, 0.1) for x in a)
limmax = max(np.percentile(x, 99.9) for x in a)
ls = np.linspace(limmin, limmax, 100)
for n in range(N):
x = a[n]
x = x[(x > limmin)&(x < limmax)]
kde = gaussian_kde(x)
plt.plot(ls, kde(ls), label='data %d' % n)
plt.xlim([limmin, limmax])
plt.legend()
plt.title('data distributions')
plt.show()
kde 객체의 resample()
메소드라든지 사용하면, 측정 데이터에 가까운 분포의 시뮬레이션용의 데이터 생성이라든지 뿌리 합니다. 자세한 내용은 공식 문서 에서.
Reference
이 문제에 관하여(파이썬에서 커널 밀도 추정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/s-wakaba/items/6ae75e326888c6a962ad
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
limmin = min(np.percentile(x, 0.1) for x in a)
limmax = max(np.percentile(x, 99.9) for x in a)
ls = np.linspace(limmin, limmax, 100)
for n in range(N):
x = a[n]
x = x[(x > limmin)&(x < limmax)]
kde = gaussian_kde(x)
plt.plot(ls, kde(ls), label='data %d' % n)
plt.xlim([limmin, limmax])
plt.legend()
plt.title('data distributions')
plt.show()
Reference
이 문제에 관하여(파이썬에서 커널 밀도 추정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/s-wakaba/items/6ae75e326888c6a962ad텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)