2012-11-20 2 views
7

피팅과 난수 생성에 관한 질문이 있습니다. 우선 I 데이터 요소의 히스토그램을python의 히스토그램에서 다른 histrogram에 맞는 확률 밀도 함수

: 같은

상황이다. 이 히스토그램을 확률 밀도 함수 (예 : 2 자유 매개 변수)로 해석하여 임의의 숫자를 생성하는 데 사용할 수 있으며이 함수를 다른 막대 그래프에 맞게 사용하고 싶습니다.

+7

어쩌면이 questoin을 다시 열고 향상시켜야합니다. –

+2

질문을 이해할 수 없다면 질문이 아니라고 확신 할 수 없습니다. 먼저 이해하려고 노력하십시오. 나는 Saullo에 가입한다. – Geeocode

답변

4

누적 밀도 함수를 사용하여 임의의 분포에서 임의의 숫자를 생성 할 수 있습니다 (described here).

부드러운 누적 밀도 함수를 생성하기 위해 히스토그램을 사용하는 것은 완전히 사소한 것은 아닙니다. 예를 들어 scipy.interpolate.interp1d()와 같이 보간을 사용하여 저장소의 가운데에있는 값을 구할 수 있으며 저장소와 항목 수가 합리적으로 많은 막대 그래프에서 제대로 작동합니다. 그러나 확률 함수의 꼬리 형태, 즉 최소 빈보다 작거나 가장 큰 빈보다 큰 값을 결정해야합니다. 예를 들어 히스토그램에 가우스를 맞추는 등의 방법으로 분포 가우시안 꼬리를 줄 수 있습니다. 또는 문제에 적합한 다른 꼬리 형태를 사용하거나 단순히 분포를자를 수 있습니다.

예 :이 꼬리를 처리하지 않습니다, 그것은 빈 더 나은 가장자리를 처리 할 수 ​​있지만이 같은 분포 이상의 값을 생성하기 위해 히스토그램을 사용하여 시작하는 것이

import numpy 
import scipy.interpolate 
import random 
import matplotlib.pyplot as pyplot 

# create some normally distributed values and make a histogram 
a = numpy.random.normal(size=10000) 
counts, bins = numpy.histogram(a, bins=100, density=True) 
cum_counts = numpy.cumsum(counts) 
bin_widths = (bins[1:] - bins[:-1]) 

# generate more values with same distribution 
x = cum_counts*bin_widths 
y = bins[1:] 
inverse_density_function = scipy.interpolate.interp1d(x, y) 
b = numpy.zeros(10000) 
for i in range(len(b)): 
    u = random.uniform(x[0], x[-1]) 
    b[i] = inverse_density_function(u) 

# plot both   
pyplot.hist(a, 100) 
pyplot.hist(b, 100) 
pyplot.show() 

.

P. 몇 가지 값으로 설명 된 특정 알려진 분포를 맞출 수도 있지만 (위의 질문에서 언급 한 것 같음) 위의 비모수 적 접근은 좀 더 일반적인 목적입니다.

+0

, 빠른 답장을 보내 주셔서 감사합니다, 보간 내 마음에 있었지만, 처음으로 그것은 outliers를 돌볼 수 없으며 또한 실제로는 밀도 함수가 아니라 초기 히스토그램의 복사본이 아닙니다. – madzone

+2

이것은 내 마지막 버전입니다. 부드럽게 작동합니다. 다시 한 번 감사드립니다. 'bins = np.linspace (0, .5, num = 800) counts18, bins = np.histogram (Z_DATA [InData18], bins = bin) x = np.cumsum (counts18) * 1./np. 합계 (counts18) * 1. y = bins [range (len (x) +1)] y = y [1 :] fit = scipy.interpolate.interp1d (x, y) plt.hist (fit (np.random.uniform (데이터, 알파 = 0.3, 대용량 = y) plt.show() '(0, x [-1], len (data))), bins = y) plt.hist – madzone

관련 문제