Python의 배포 함수 샘플

Sep 11 2020

배열이 있습니다.

array([1,1,1,1,1,
1,1,1,0.96227599,0,
0,1,1,1,1,
0,0,1,0,0,
1,1,1,0,1,
1,1,0,1,0,
0,1,0,0,1,
0,0,1,1,1,
1,1,0,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,0,0,0,
1,0,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
0.94795539,0.85308765,0,0,1,
1,1,0.9113806,1,1,
1,1,1,1,1,
1,0,1,1,0,
1,1,1,1,1,
1,1,0.20363486,0.50635838,0.52025932,
0,0.34747655,0.50147493,0,0.4848249,
0,0.88495575,0,0.27620151,0.3981369,
0,0,0])

값의 범위는 0에서 1까지입니다. 확률 분포 함수를 어떻게 그릴 수 있습니까? 그런 다음 각 행에 5 개의 열이있는 1000 개의 행으로 테이블을 채 웁니다. 실제로 표를 5 개 값의 샘플로 채 웁니다.

답변

1 scleronomic Sep 11 2020 at 17:44

pdf샘플에서 를 얻으려면 kernel density estimator. 한 가지 옵션은 gaussian_kde양식 scipy.stats입니다.

여기에는 자동 대역폭 결정이 포함됩니다. 추정은 단일 모드 분포에 가장 적합합니다. bimodal 또는 multi-modal 분포는 지나치게 평활화되는 경향이 있습니다.

샘플은 클러스터가 0과 1 인 강력한 이중 모델로 보이므로 sklearns 를 사용하는 것이 좋습니다 KernelDensity. 여기에서 특정보다 효율적으로 제어 할 algorithm, kernel하고 bandwidth. Sklearn에는 밀도 추정에 대한 소개도 있습니다.

두 방법의 워크 플로는 매우 유사합니다.

import numpy as np
from scipy import stats
from sklearn.neighbors import KernelDensity
import matplotlib.pyplot as plt

a = np.array([1,1,1,1,1,1,1,1,0.96227599,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,1,0,0,1,0,0,1,1,1,1,1,0,1,1,1,1,1,
              1,1,1,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0.94795539,0.85308765,0,0,1,1,1,0.9113806,1,1,1,1,
              1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0.20363486,0.50635838,0.52025932,0,0.34747655,0.50147493,0,0.4848249,0,
              0.88495575,0,0.27620151,0.3981369,0,0,0])

kde1 = stats.gaussian_kde(a)
x1 = np.linspace(0, 1, 100)
y1 = kde1.pdf(x1)

kde2 = KernelDensity(bandwidth=0.1).fit(a.reshape(-1, 1))
y2 = kde2.sample(10000)

kde3 = KernelDensity(bandwidth=0.01).fit(a.reshape(-1, 1))
y3 = kde3.sample(10000)

fig, ax = plt.subplots()
ax.plot(x1, y1, c='b')
ax.hist(y2.ravel(), bins=100, density=True, color='r', alpha=0.7)
ax.hist(y3.ravel(), bins=100, density=True, color='m', alpha=0.7)

이 방법은 [0, 1] 사이의 값에 대해 pdf를 제한하지 않습니다. 두 번째 단계에서 필터링하여 직접 처리해야합니다. 그러나 작은 밴드를 선택하면 꽤 가까워 질 것입니다.


질문의 두 번째 부분을 잘 이해하지 못합니다. 추정 된 분포에서 새 샘플을 추출하려면 kde.sample()(sklearn) / kde.resample()(scipy) 를 통해 수행 할 수 있습니다 . 그리고 그 값을 테이블에 채우는 것은 StackOverflow에서 확실히 답을 찾을 수있는 다른 질문입니다.