2017-10-24 13 views
3

, 그냥 내가 NumPy와 일부 통계에 부트 스트랩 오류 추정을 위해 노력하고 있어요 하단 수평 라인NumPy로 여러 번 큰 배열을 샘플링하는 효율적인 방법은 무엇입니까? 당신은 내가 구현하기 위해 노력하고있어의 세부 사항에 대해 상관하지 않는 경우

과거 건너 뜁니다. 배열이 x이고 오류 분석에서 일반적인 가우시안 가정이 적용되지 않는 통계량 f(x)에서 오류를 계산하고자합니다. x은 매우 큽니다.

나는 교체와 함께, 내 리 샘플의 크기가 원래 배열의 크기 numpy.random.choice()를 사용하여 x 리샘플링,이 작업을 수행하려면이 나에게 x의 새로운 구현을 제공

resample = np.random.choice(x, size=len(x), replace=True)

. 이 작업은 이제 정확한 오류 예측을하기 위해 ~ 1,000 번 반복해야합니다. 이 성질의 1,000 개의 리사이클을 생성한다면;

resamples = [np.random.choice(x, size=len(x), replace=True) for i in range(1000)]

하고 각 구현에 f(x) 통계치를 계산;

results = [f(arr) for arr in resamples]

는 뭔가 같은

np.std(results)

가우스 오류 분석을 사용하더라도 f(x)자체 설명 할 수없는 것으로 생각, 배포 될 f(x)의 오차를 추정 한 f(x) 대책에 임의의 오류가 있습니다 될 수 있습니다.


좋습니다. 부트 스트랩입니다. 이제 내 문제는 라인

resamples = [np.random.choice(x, size=len(x), replace=True) for i in range(1000)]

가 큰 배열에 대한 매우 느린 것입니다. 목록 이해없이 이것을 할 수있는 현명한 방법이 있습니까? 두 번째 목록 이해

results = [f(arr) for arr in resamples]

함수 f(x)의 세부 사항에 따라, 꽤 느릴 수 있습니다.우리는 반복을 허용하고 있기 때문에

+1

서브 샘플을 작성하지 않으려면 대신 샘플에 해당 데이터가 포함되어 있으면 1이고 그렇지 않은 경우에는 0 인 플래그 배열을 작성하십시오. 그런 다음 하위 샘플을 만드는 것은 플래그를 치환하는 것을 의미합니다. 서브 샘플 배열을 할당하고 채우는 것이 계산 시간의 상당 부분이라면 플래그로 작업하는 것이 승리입니다. –

+0

@ RobertDodier 감사합니다! 이것은 인덱싱보다는 배열 마스킹을 사용하지만 Divakar의 대답과 매우 유사합니다. 나는 그것들 중 어느 것이 더 빨라질 지 확신하지 못한다. – Anonymous

+0

네, 단지 인덱스 목록을 사용하는 것은 동등하고 단순히 데이터를 포함/제외해야하는 경우 더 간단 할 수 있습니다. 1이나 0 이외의 다른 가중치를 원했던 경우가 많습니다. 가중치> 1을 사용하여 일부 샘플을 대체하거나 강조하는 샘플링을 나타낼 수 있습니다 (예 : 데이터의 예제가 적은 클래스). 0가 아닌 가중치가 필요하지 않은 경우 색인 목록 만 사용할 수 있습니다. –

답변

3

, 우리는 np.random.randint로 한 번에 모든 인덱스를 생성 할 수 있으며, 단순히 지수는 그래서 같은 resamples 해당 얻을 -

num_samples = 1000 
idx = np.random.randint(0,len(x),size=(num_samples,len(x))) 
resamples_arr = x[idx] 

또 하나의 접근 방식에서 난수를 생성하는 것입니다 그래서 같은 배열의 길이 numpy.random.rand 스케일 균일 분포 -

resamples_arr = x[(np.random.rand(num_samples,len(x))*len(x)).astype(int)] 
x 5000의 elems와

런타임 테스트 -


In [221]: x = np.random.randint(0,10000,(5000)) # Original soln In [222]: %timeit [np.random.choice(x, size=len(x), replace=True) for i in range(1000)] 10 loops, best of 3: 84 ms per loop # Proposed soln-1 In [223]: %timeit x[np.random.randint(0,len(x),size=(1000,len(x)))] 10 loops, best of 3: 76.2 ms per loop # Proposed soln-2 In [224]: %timeit x[(np.random.rand(1000,len(x))*len(x)).astype(int)] 10 loops, best of 3: 59.7 ms per loop 
600,000 요소의 매우 큰 배열 xx

매우 큰 경우, 당신은 1000 샘플 모든 인덱스를 만들하지 않을 수 있습니다. @Divakar에 의해 언급으로

In [234]: x = np.random.randint(0,10000,(600000)) 

# Original soln 
In [235]: %timeit np.random.choice(x, size=len(x), replace=True) 
100 loops, best of 3: 13 ms per loop 

# Proposed soln-1 
In [238]: %timeit x[np.random.randint(0,len(x),len(x))] 
100 loops, best of 3: 12.5 ms per loop 

# Proposed soln-2 
In [239]: %timeit x[(np.random.rand(len(x))*len(x)).astype(int)] 
100 loops, best of 3: 9.81 ms per loop 
+0

아, 물론 고마워요. 나는'rand'로 접근법을 구현할 것입니다. 또한 나는''매우 컸다 '고 말했다. 그것은 60 만개 이상의 요소입니다. 그래서 타이밍 결과를 외삽함으로써, 약 4 시간의 실행 시간을 절약 할 수 있습니다. – Anonymous

+0

@jphollowed 이렇게 큰'x'를 가진 와우는이 글에서 제안한 모든 인덱스를 만들지 못할 수도 있습니다. 하지만 충분한 시스템 메모리가 있다면 사용해보십시오. – Divakar

+0

@jphollowed 또한 '매우 큰 x 섹션'을 확인하십시오. – Divakar

2

당신이 아니라 지능형리스트를 사용하는 것보다 재 샘플링의 2 차원 배열을 얻을 수 size에 튜플을 전달할 수 있습니다 -이 경우, 샘플 당 솔루션은이 같은 자신의 타이밍 뭔가있을 것입니다.

여기서 f은 다른 기능이 아니라 단지 합계라고 가정하십시오. 그러면 :

x = np.random.randn(100000) 
resamples = np.random.choice(x, size=(1000, x.shape[0]), replace=True) 
# resamples.shape = (1000, 1000000) 
results = np.apply_along_axis(f, axis=1, arr=resamples) 
print(results.shape) 
# (1000,) 

여기 np.apply_along_axis[f(arr) for arr in resamples]에 틀림 단지 영광을위한 루프 동일하다. 그러나 귀하의 질문에 따라 x 색인을 생성해야하는지 확실하지 않습니다.

+0

이것은 매우 간단하고 실질적으로 빠르며, 약 4 배 더 빠릅니다. 리샘플링을 수행하는 원래의 코드는 루프 당 16 ms가 걸리고 튜플로 크기를 지정하는 것은 4ms보다 작습니다. – Anonymous

+0

이 문제는 일반적으로 작동하지 않는다는 것입니다. 즉'f (x) '가 발생하면 문제가됩니다. 2 차 통계량으로, * 대체하지 않고 * 샘플링하려고 함을 의미합니다.원하는 동작은'size' 튜플에 의해 지정된 각 행 *이 교체를 금지하지만 이전 행과 샘플을 공유하는지 신경 쓰지 않습니다. ValueError : 'replace = False'일 때 채우기보다 큰 샘플을 취할 수 없음 – Anonymous

+0

간단히 말해서,이 방법을 사용하여 데이터 집합의 N 개의 재 샘플 실현을 수행 할 수 없습니다. 각 실현은 대체없이 샘플링됩니다. – Anonymous