정규 분포에 대해 역종 곡선을 표시하는 데이터를 어떻게 생성 할 수 있습니까?
Nov 17 2020
아래 코드를 사용하여 정규 분포를 따르는 무작위 데이터를 생성했습니다.
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
rng = np.random.default_rng()
number_of_rows = 10000
mu = 0
sigma = 1
data = rng.normal(loc=mu, scale=sigma, size=number_of_rows)
dist_plot_data = sns.distplot(data, hist=False)
plt.show()
위의 코드는 예상대로 아래 분포도를 생성합니다.

아래와 같이 정확히 역곡 선인 분포도를 만들고 싶다면 어떻게 랜덤 정규 분포 데이터를 생성 할 수 있습니까?

분포도가 역 곡선을 표시 할 데이터를 원합니다. 이 정규 분포 데이터를 어떻게 생성 할 수 있습니까?
답변
2 SamMason Nov 17 2020 at 18:44
이것이 얼마나 유용한 지 확실하지 않지만 거부 샘플링으로 쉽게 할 수 있습니다. Peter O의 이전 솔루션 에서 API를 빌 렸지만 성능을 위해 블록으로 작업하면 다음과 같은 이점이 있습니다.
import numpy as np
def invNormal(low, high, mu=0, sd=1, *, size=1, block_size=1024):
remain = size
result = []
mul = -0.5 * sd**-2
while remain:
# draw next block of uniform variates within interval
x = np.random.uniform(low, high, size=min((remain+5)*2, block_size))
# reject proportional to normal density
x = x[np.exp(mul*(x-mu)**2) < np.random.rand(*x.shape)]
# make sure we don't add too much
if remain < len(x):
x = x[:remain]
result.append(x)
remain -= len(x)
return np.concatenate(result)
로 사용할 수 있습니다 sns.histplot(invNormal(-4, 4, size=100_000), bins=51)
.

확률 밀도는 1로 통합되어야하므로 "더 넓게"만들수록 밀도가 작아집니다 (즉, x 축의 범위가 [인 경우 y 축에서 밀도가 0.4 일 수 없습니다. -4, +4]). 또한 KDE를 생성하는 것은 가장자리의 불연속성으로 인해 어려움을 겪기 때문에 덜 유용하다고 느낍니다.