2014-12-16 1 views
1

확률 적 시뮬레이션에서 자주 발생하는 문제는 몇 가지 이벤트 중 어느 것이 발생하는지 계산하는 것입니다. 이것은 일반적으로 각 이벤트에 대한 확률을 가지고 수행됩니다. 그런 다음 난수를 생성 한 다음 가능한 이벤트의 반복을 통해 확률의 합이 난수를 초과 할 때까지 반복합니다.최대 dict 값을 임계 값까지 합산 - itertools.takewhile?

여기 내가 원하는 것을 수행하는 코드가 있지만 더 좋은 방법을 수행하고 있습니다. 가능성이 takewhile를 사용하여 - - getEvent을 정의하는보다 컴팩트 한 방법이 될 수있을거야처럼

import random 

def getEvent(eventProbabilities,probability): 
    S = 0 
    for key in eventProbabilities.keys(): 
     S += eventProbabilities[key] 
     if S>= probability: #key is the event to happen. 
      break 
    return key 

x = {'event1' : 0.1 , 'event2' : 0.2 , 'event3' : 0.2 , 'event4' : 0.4, 'event5' : 0.1} #values sum to 1. 
p = random.random() #random number between 0 and 1. 
event = getEvent(x,p) 
print p, event 

는 느낌하지만 난 그것을 찾을 수 없습니다.

나는 이것이 내 코드가 대부분의 시간을 보내는 곳이라고 생각하기 때문에 최대한의 효율성을 보였습니다.

itertools (또는 다른 방법)를 통해 더 효율적으로 만들 수있는 방법이 있습니까?

수정 사항은 반복 순서를 신경 쓰는지 여부에 대해 아래에 추가되었습니다.

키가 순서대로 처리된다는 것을 알 수 있습니다. 이 순서는 난수 p와는 독립적입니다. 나열된 순서대로 처리하는 경우를 생각해 봅시다. p<=0.1 인 경우 event1이 반환되므로 10 %의 확률로 event1입니다. 0.1<p<0.3이면 event2 (20 % 확률)을 반환합니다. 이제 다른 순서를 고려해 보겠습니다. 역순으로 진행한다고 가정 해보십시오. 이 경우 0.9<pevent1 (10 %)이고 0.7<p<=0.9이면 event2 (다시 20 %)입니다. 따라서 각 이벤트의 확률은 순서에 관계없이 동일합니다.

1 이벤트를 선택하고 해당 이벤트를 해당 확률로 선택하겠습니다.

+0

여기서 이벤트 순서가 중요합니까? – thefourtheye

+0

알 수없는 순서로 키 반복을 묻는다면 문제가되지 않습니다. (상황이 빨라지는 확률로 내림차순으로 반복하는 것이 맞는지는 모르겠지만 사전에 그 순서를 모를 것입니다.) – Joel

+0

그리고 임계 값을 초과하는 이벤트를 원하십니까? – thefourtheye

답변

3

정확하게 이해한다면 주어진 확률로 목록에서 요소를 선택하기 만하면됩니다. numpy을 사용하지 않으시겠습니까?

>>> x = {'event1': 0.1 , 'event2': 0.2 , 'event3': 0.2 , 'event4': 0.4, 
     'event5': 0.1} 
>>> events, p = zip(*x.items()) 
>>> np.random.choice(events, p=p, replace=False) 
'event4' 
+0

이것은 최고의 옵션 일 수 있습니다 (나는 numpy가 변수 확률을 처리한다는 것을 인식하지 못했습니다). 값 (그리고 심지어는 키의 수)이 바뀔 것이기 때문에 이것을 통해 갈 때마다 신선한 목록을 생성해야합니다. 그걸 피할 ​​수있는 방법이 있습니까? – Joel

+0

@Joel 나는 본다. 나는'np.random.choice'가 이미 계산 된 확률의 배열과 같은 입력을 필요로하기 때문에 두려워하지 않는다. 정규화 요소를 계산하기 위해 모든 확률을 사전에 계산해야합니까? 또는 올바르게 정규화 된 확률을 한 번에 하나씩 생성 할 수 있습니까? – jme

+0

한 번에 하나씩 올바르게 생성 할 수 있습니다. 내가 시뮬레이션하는 문제에 따라 (이것은 자주 발생합니다), 때로는 모든 것을 미리 가지고 있습니다. – Joel