2014-01-18 2 views
0

나는 n 샘플의 몬테카를로 시뮬레이션을 수행했습니다. 각 샘플에 대해 난 내가 얻 결과 때문에 아마도 값 사이를 산출 할 것은 :몬테카를로 시뮬레이션에서 샘플의 평균 계산

X = X1, X2, ..., Xn에]

(여기를 Xi는 행렬 또는 숫자 일 수 있음).

이제 Xmean이라고하는 논문 샘플의 평균을 계산하고 싶습니다. 그래서 같은 것을 얻기 위해 필요

Xmean = X1 (X1의 +의 X2)/2, (X1 + X2 + X3)/3 ... (X1 + X2 + ... + Xn을)/N] 파이썬에서

, 나는 코드 쓰기 :이 코드를 속도를 높일 수 있다면 잘하지만 너무 느린 작동

for i in range(N): 
    for j in range(i+1): 
     Xmean(i) = Xmean(i) + X(j) 
    Xmean(i) = Xmean(i)/(i+1) 

를, 내가 알고 싶습니다? 여러분이 몬테카를로 시뮬레이션에 도움이되는 흥미로운 Python의 라이브러리를 제안 해 주실 수 있다면.

감사합니다,

답변

0

단순히 계산의 양을 감소시킴으로써,

Xmean(0) = X(0) 
for i in range(N-1): 
    Xmean(i+1) = (Xmean(i)*(i+1) + X(i+1))/(i+2) 
+0

감사합니다. 더 빠릅니다. D – user2863620

1
import timeit, numpy 

setup = ''' 
from __main__ import mc0, mc1, mc2 
import random, numpy 

random.seed(0) 
n = 10**3 
data = [random.randint(0, 2**32-1) for _ in range(n)] 
np_data = numpy.array([float(x) for x in data]) 
''' 

# your implementation 
def mc0(data): 
    xmean = [] 
    for i in range(len(data)): 
     xmean.append(0) 
     for j in range(i+1): 
      xmean[i] += data[j] 
     xmean[i] = xmean[i]/(i+1) 
    return xmean 

# my implementation 
def mc1(data): 
    xmean = [] 
    for i, x in enumerate(data): 
     if i == 0: 
      new = x 
     else: 
      new = x/(i+1) + xmean[i-1] * (i/(i+1)) 
     xmean.append(new) 
    return xmean 

# Donbeo's numpy implementation 
def mc2(data): 
    xmean = numpy.cumsum(data)/numpy.array(range(1, len(data)+1)) 
    return xmean 


number = 100 
things = [('mc0', 'mc0(data)'), 
      ('mc1', 'mc1(data)'), 
      ('mc2', 'mc2(np_data)')] 
for note, call in things: 
    print('{:20} {}'.format(note, 
          timeit.timeit(call, setup=setup, number=number))) 

결과 : 각 루프 반복에서 x(1)..x(i) 이상 합계를 다시 실행 의미가 없다

mc0     26.023956370918587 
mc1     0.1423197092108488 
mc2     0.13584513496654083 

, 이미 해당 정보가 xmean에있는 경우 Donbeo의 numpy 버전은 순수 Python 버전보다 약간 빠르며 둘 다 원래 버전보다 약 200 배 더 빠릅니다 (이러한 데이터의 경우 어쨌든).

+0

답변 해 주셔서 감사합니다. – user2863620

0

numpy를 사용하면 쉽습니다.

import numpy as np 

X = [1,5,3,8,6,9] 
Xmean = np.cumsum(X) 
Xmean = Xmean/np.array(range(1,len(X)+1) 
+0

이렇게하면 0으로 나누기 오류가 발생합니다. – senshin

+1

나는 이것이 정확하다고 생각한다 : Xmean = Xmean/np.array (범위 (1, len (X) +1)) – user2863620

+0

내가 코드를 바꿨다. – Donbeo