일하면서 데이터의 분포 별로 랜덤 값을 뽑아야 했었는데, 기억해두면 유용할 것 같아 작성한다.
원하는 분포에 맞는 함수를 선택하고, 가진 데이터 분포에 대해 피팅하면 된다.
피팅된 함수에서 랜덤 샘플을 뽑는 방식은
직접 pdf 값을 계산하여 확률을 choice에 지정해주는 방식으로 구현하였다.
아래와 같은 그림으로 피팅된다.

아래는 코드이다.
from scipy.optimize import curve_fit
def gaussian(x, A, mu, sigma):
return A*np.exp(-(x-mu)**2/2./sigma**2)
# 피팅을 원하는 분포 저장하기
hist, bins, _ = ax.hist(data, bins=30)
# 데이터 범위 저장하기
data_range = (data.min(), data.max())
# 피팅을 위해 bins 값 맞춰주기
newbins = []
for i in range(len(bins)-1):
newbins.append((bins[i]+ bins[i+1])/2.)
# 데이터 피팅
popt, pcov = curve_fit(gaussian, newbins, hist, p0=[5, -1000, 500], maxfev=100000)
# 피팅한 분포에서 랜덤하게 sample 뽑기
x_values = np.linspace(data_range)
pdf_values = gaussian(x_values, *popt)
sample = np.random.choice(x_values, size=1, p=pdf_values / np.sum(pdf_values))
'Code > Python' 카테고리의 다른 글
Python 클래스 톺아보기 _ 1편 (0) | 2025.02.28 |
---|---|
파이썬의 스케쥴러, sched (0) | 2024.02.04 |
[python] 이중리스트 할당을 조심하세요! (0) | 2023.07.05 |
[python] 코드 실행 시간 측정하기 (0) | 2022.08.07 |
NumPy 어레이 정렬 np.argsort() (0) | 2022.05.02 |
댓글