2017-11-30 12 views
1

내 비닝 데이터 (numpy.histogram 함수 밖)에 대해 (scipy.stats.moment에서 나온 것과 동일) 을 계산하는 함수를 찾고 있습니다. binned 데이터에 sci.stats.moment 함수가 있습니까?

# Generate normal distributed data 
import numpy as np 
import matplotlib.pyplot as plt 
data = np.random.normal(size=500,loc=1,scale=2) 
H = np.histogram(data,bins=50) 
plt.scatter(H[1][:-1],H[0]) 
plt.show() 

내 위의 코드, 예를 들어 그 결과는 처음 네 순간이 시그마 = 2와 (중앙 모멘트) 미국 (0,4,0,48)이어야한다.

+1

이 경우 두 번째 순간 (분산)이 4가 아니어야합니까? 나는 scipy.stats에서 histograms (보통 이것은 원시 데이터를 사용하는 것보다 정확하지 않음)에서 작동하는 함수를 인식하지 못합니다. '데이터'에서 순간을 직접 계산할 수없는 이유는 무엇입니까? – kazemakase

+0

죄송합니다. 귀하의 권리는 4이어야합니다. 다음에 직접 계산하겠습니다.하지만 오랜 시간 동안 시뮬레이션을하고 결과를 사용하고 싶습니다. – user7784503

답변

1

비닝 된 데이터로 작업하는 것은 기본적으로 가중치 데이터로 작업하는 것과 같습니다. 하나는 각 빈의 중간 점을 데이터 점으로 사용하고 그 빈의 무게를 해당 빈의 개수로 사용합니다. scipy.stats.moment 가중치를 지원하면이 계산을 직접 수행 할 수 있습니다. 그대로, 가중치를 지원하는 numpy.average 메소드를 사용하십시오.

midpoints = 0.5 * (H[1][1:] + H[1][:-1]) 
ev = np.average(midpoints, weights = H[0]) 
print(ev) 
for k in range(2, 5): 
    print(np.average((midpoints - ev)**k, weights = H[0])) 

출력 (분명히 랜덤) :

1.08242834443 
4.21602099286 
0.713129264647 
51.6257736139 

내가 대신 예상 값을 인쇄, (공사에 의해 0)을 중심으로 제 1 회 순간을 인쇄하지 않았다. 이론적으로 *, 이것들은 1, 4, 0, 48입니다. 그러나 어떤 주어진 샘플에 대해서, 분포의 매개 변수로부터 약간의 편차가있을 것입니다.

(*) 정확하게는 아닙니다. 분산 수식에서 나는 보정 계수 n/(n-1)을 포함하지 않았다 (n은 데이터 세트의 총 크기, 즉 가중치의 합계 임). 이 요인은 sample variance을 조정하여 모집단 분산의 불편 추정치가됩니다. 원한다면 포함시킬 수 있습니다. 고차원 적 순간에 비슷한 조정이 필요할 것입니다 (목표가 비 공산적 추정량을 갖는 것이라면).하지만 이것을 살펴 봐야 할 것입니다. 그리고 어쨌든 이것은 통계 사이트가 아닙니다.