일기예보를 보면 강수확률이 나오죠. 이번 주말에 서울에 비올 확률이 15%라고 합니다. 과연 이 확률은 어떻게 나오는걸까요?
오늘은 수학숙제와 함께하는 날씨 이야기를 가져왔습니다. 해설을 다 적어두긴 했지만 원한다면 여러분들도 직접 풀어보세요.
자. 여기 정말 완벽한 기상 모델이 있다고 합니다. 이 기상 모델은 {맑음, 흐림, 비} 3 가지 상태를 가지고 있고, 내일 날씨는 오늘 날씨에 따라서 아래 확률 표에 따라 정해집니다:
↓오늘 | 내일→ | 맑음 | 흐림 | 비 |
맑음 | 1/2 | 1/3 | 1/6 |
흐림 | 1/4 | 1/2 | 1/4 |
비 | 1/5 | 2/5 | 2/5 |
1. 오늘 날씨가 맑다고 칩시다. 그렇다면 내일 모레 비올 확률은 얼마일까요?
- P(내일 맑고 모레 비) + P(내일 흐리고 모레 비) + P(내일 비 모레 비) = 1/2*1/6 + 1/3*1/4 + 1/6*2/5 = 7/30 = 23.333..% 입니다.
2. 30일차에는 어떻게 될까요? 물론 위 표를 행렬로 만든 뒤 곱해가면서 앞으로의 날씨 확률 벡터를 계산할 수 있지만, 시뮬레이션을 통해 알아보는 방법도 있습니다. 여러분이 좋아하는 프로그래밍 언어로 날씨 시뮬레이터를 구현해봅시다.
- MC 클래스는 현재 상태 x ∈ [맑음=0,흐림=1,비=2] 를 가집니다.
- step 메서드는 내일의 상황을 시뮬레이션합니다.
- N=500 개의 MC 를 생성하고, 30일간 시뮬레이션하세요.
- 이제 내일, 모레, 그리고 30일 차의 샘플들을 히스토그램으로 그려봅시다.
30일차의 inv. measure 는 state transition matrix 의 고유벡터로 6/19, 8/19, 5/19 입니다. 그래프 단위가 좀 이상한데 190개로 돌리고 샘플 개수를 적은 것이라 그렇습니다. 3 일차 비온 샘플이 45개로 대충 이론값과 유사하군요.
3. 달무리가 지는 것은 다음날이 맑지 않다 (흐리거나 비가 온다)는 뜻이라고 합니다. 오늘 밤 달무리가 생겼습니다. 그렇다면 내일 모레 맑고/흐리고/비가 올 확률은 어떻게 될까요? 2번에서 얻은 샘플들을 활용해서 계산해볼 수 있을까요?
- 시뮬레이션 샘플 500개 중 2일차에 맑다고 한 녀석들을 다 버리고 남은 샘플들만 활용해서 확률을 계산하면 됩니다.
- 대략 절반정도의 샘플이 버려지게 되지만 어쩔 수 없지요.
- 확실히 비오거나 흐릴 확률이 확 올라간 것을 볼 수 있습니다.
4. 우리의 달무리 이론이 사실 그렇게 믿음직스럽지 못하다고 합니다. 사실 달무리와 내일 날씨의 연관성은 반반이라서, 50%의 확률로 페이크였다고 합시다. 시뮬레이션 결과를 어떻게 수정하면 될까요?
- 여러가지 구현 방법이 있는데, 2일차가 맑았던 시뮬레이션 중 랜덤으로 50%를 버리는 방법이 있고, 또는 해당 샘플들을 나중에 셀 때 0.5개로 치는 방법이 있습니다. 혹은 그냥 2번과 3번의 결과를 평균내도 되겠지요.
5. 3~4번에서 우린 시뮬레이션 결과 중 일부를 버렸습니다. 즉 처음에 500개로 시작했지만 우리가 관측을 계속 할 수록, 관측과 맞지 않는 시뮬레이션 결과는 버려지게 되다보니 어쩔 수 없이 날이 갈 수록 샘플 수가 적어지게 되죠. 아마 살아남은 샘플들이 좀더 "현실에 가까운" 녀석들임은 분명합니다만, 샘플 수가 적으면 앞으로의 시뮬레이션에서 다양성/유연성이 떨어지게 됩니다. 어떻게 해결할까요?
- 적당한 시점에, 지금까지의 결과에 붙은 가중치값을 바탕으로 다시 뽑기를 돌려서 시뮬레이션 수를 다시 늘리면 됩니다.
여담
Particle Filtering 의 기초 원리에 대한 숙제입니다. 글이 어색한 것은 영어로 쓴걸 번역했기 때문..
수학적으로 Particle filter 는 베이즈 정리 (Bayes theorem)의 결과물을 몬테 카를로 시뮬레이션으로 추출하는 방법입니다.
현재 X 의 샘플을 N개 가진 상태에서 Y 라는 정보가 들어오면, 베이즈 정리 P(X|Y) = P(Y|X)P(X) / P(Y) 에서 P(X) 는 지금 샘플들이 잘 표현해주고 있고, P(Y)는 그냥 총합 1 되게 정규화하면 되니까, P(Y|X) 만 각 샘플에 가중치로 곱해주면 됩니다. 그리고 이 가중치에 따라 다시 N개의 샘플을 뽑고, 시뮬레이션을 돌리고를 반복하죠.
심심하시다면 나무위키에 [몬테 카를로 방법]과 [베이즈 정리] 가 모두 있습니다. 대체 왜 있는거지?
암튼 제목에 쓴 주말에 비올 확률은..
- 날씨 시뮬레이션 500개 중에서 근데 이중에 75개가 일요일에 비가 온다? 그러면 그러면 일요일에 비올 확률이 15%인 겁니다.
- 그런데 이제 위성도 보고, 관측소도 확인하고, 가능한 정보들을 모아보잖아요. 그러면 이중에 어떤건 엄청 잘 맞고, 어떤건 영 안 맞고 할겁니다.
- 그러면 지금 시뮬레이션 중에서 잘 맞는 녀석들은 살리고, 안 맞는 녀석들은 죽입니다. 이걸 몇 년 간 계속 튜닝하면서 돌리는거죠.
- 실제 일기예보의 경우 계산하는 변수의 차원이 천만개 단위입니다. 이 많은 변수들과 엄청나게 복잡한 기상 시뮬레이션을 수백 수천개를 돌리는 것은 슈퍼컴퓨터로도 힘들기 때문에, 위에 설명한 가중치를 주고 새로 뽑는 방법 대신 좀 적은 수 (50~100개 정도)의 시뮬레이션을 돌리되, 각 시뮬레이션의 X 값을 관측값에 맞춰 조금 더 그럴듯한 수치로 수정하는 식으로 계산합니다..만 이건 또 다른 이야기.