import numpy as np
07wk-1: 마코프체인 (2)
2023-04-13
강의영상
youtube: https://youtube.com/playlist?list=PLQqh36zP38-wi47mCKi03xoqvwIzkxG0H
import
확률과정
-
동전을 무한히 던지는 시행을 생각하자. 동전을 10번 던져서 결과를 관찰했다고 하자. 동전을 30번째 던져서 앞면이 나올지 뒷면이 나올지 알고 싶다면?
-
현재 삼성전자 주가는 66000이다. 20일뒤의 삼성전자 주가가 얼마일지 알고 싶다면?
-
원래 미래를 예측하기 위해서 해야하는 과정
-
하지만 현실적으로는 이게 너무 힘들지 않을까?
날씨예측
-
아래와 같이 세상의 법칙이 있다고 하자.
- 어제 맑음 \(\to\) 오늘도 맑음: 40% // 오늘은 비: 60%
- 어제 비 \(\to\) 오늘은 맑음: 70% // 오늘도 비 30%
-
모든 \(t\)에 대하여 확률변수 \(X_t\)를 아래와 같이 정의하자.
- \(X_t=\begin{cases} 0 & \text{맑음} \\ 1 & \text{비} \end{cases}\)
-
오늘 (2023년4월13일) 비가 왔다고 치자. 10000일 뒤에도 비가 올 확률은 얼마일까?
풀이1
-
\(X_t=0\) 이라면? (\(t\)시점에 비가 오지 않았다면?)
< 0.6 np.random.rand()
False
-
\(X_t=1\) 이라면? (\(t\)시점에 비가 왔다면?)
0) < 0.3 np.random.rand(
array([], dtype=bool)
-
두 코드를 합쳐보자.
def rain(before):
if before == True: # 비가 왔음
= np.random.rand() < 0.3
after else: # 비가 안왔음
= np.random.rand() < 0.6
after return after
-
테스트
# 비가 왔음, Xt = 1
sum([rain(1) for i in range(100)])
30
# 비가 안왔음, Xt = 0
sum([rain(0) for i in range(100)])
60
-
하나의 \(\omega\)에 대응하는 길이가 10000인 확률과정을 관찰
def doctor_strange(today):
= [today]
lst for i in range(10000):
lst.append(rain(lst[i]))return lst
= True # 오늘 비가 왔다는 뜻
today = doctor_strange(today) arr
len(arr)
10001
-
4305개의 \(\omega\)에 대응하는 길이가 10000인 확률과정을 관찰
= True # 오늘 비가 왔다는 뜻
today = np.array([doctor_strange(today) for ω in range(4305)]) arr
-1].mean() arr[:,
0.4662020905923345
-
10000일 뒤에도 비가 올 확률은 약 46% 정도 인듯
풀이2
-
세상의 법칙을 다시 정리해보자.
- \(X_{t-1}=0 \Rightarrow X_t \sim Ber(0.6)\)
- \(X_{t-1}=1 \Rightarrow X_t \sim Ber(0.3)\)
-
정리하면
- \(P(X_t=0)= P(X_{t-1}=0) \times 0.4 + P(X_{t-1}=1) \times 0.7\)
- \(P(X_t=1)= P(X_{t-1}=0) \times 0.6 + P(X_{t-1}=1) \times 0.3\)
-
매트릭스형태로 표현하면
- \(\begin{bmatrix} P(X_t=0) \\ P(X_t=1) \end{bmatrix}= \begin{bmatrix} 0.4 & 0.7 \\ 0.6 & 0.3 \end{bmatrix} \begin{bmatrix} P(X_{t-1}=0) \\ P(X_{t-1}=1) \end{bmatrix}\)
- \({\boldsymbol \mu}_t = {\bf P} {\boldsymbol \mu}_{t-1}\)
-
이렇게 놓고 보니까
- \({\boldsymbol \mu}_1 ={\bf P}{\boldsymbol \mu}_0\)
- \({\boldsymbol \mu}_2 ={\bf P}{\boldsymbol \mu}_1={\bf P}^2{\boldsymbol \mu}_0\)
- \(\dots\)
- \({\boldsymbol \mu}_{10000} ={\bf P}^{10000}{\boldsymbol \mu}_0\)
-
이제 계산을 해보자.
0 = np.array([[0],[1]])
μ0 μ
array([[0],
[1]])
= np.array([[0.4,0.7],[0.6,0.3]])
P P
array([[0.4, 0.7],
[0.6, 0.3]])
@P # P의 제곱 P
array([[0.58, 0.49],
[0.42, 0.51]])
@P@P@P # P의 4제곱 P
array([[0.5422, 0.5341],
[0.4578, 0.4659]])
@P@P@P @ P@P@P@P # P의 8제곱 P
array([[0.53849182, 0.53842621],
[0.46150818, 0.46157379]])
@P@P@P@P@P@P@P @ P@P@P@P@P@P@P@P # P의 16제곱 P
array([[0.53846154, 0.53846154],
[0.46153846, 0.46153846]])
\({\bf P}\)가 수렴하는거 같지 않어?
@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P @ P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P P
array([[0.53846154, 0.53846154],
[0.46153846, 0.46153846]])
대충 \({\bf P}^{10000} \approx {\bf P}^{32}\)
= P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P @ P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P
Plim Plim
array([[0.53846154, 0.53846154],
[0.46153846, 0.46153846]])
@ μ0 Plim
array([[0.53846154],
[0.46153846]])
-
이 풀이에 따르면 10000일 뒤에 비가 올 확률은 46% 정도이다.
풀이3
-
세상의 법칙을 다시 정리해보자.
- \(X_{t-1}=0 \Rightarrow X_t \sim Ber(0.6)\)
- \(X_{t-1}=1 \Rightarrow X_t \sim Ber(0.3)\)
-
추측: 10000일 뒤에 비가 올 확률이 \(p\)라고 치자. 그렇다면 9999일 뒤에 비가 올 확률도 \(p\) 아닐까?
이걸 가정하고 계산해보자
1
. 9999일 뒤에 비가 안 올 확률 \(1-p\)
- 9999일 뒤에 비가 안오고, 10000일 뒤에는 비가 올 확률: \(0.6(1-p)\)
- 9999일 뒤에 비가 안오고, 10000일 뒤에는 비가 안 올 확률: \(0.4(1-p)\)
2
. 9999일 뒤에 비가 올 확률 \(p\)
- 9999일 뒤에 비가 오고, 10000일 뒤에도 비가 올 확률: \(0.3p\)
- 9999일 뒤에 비가 오고, 10000일 뒤에는 비가 안 올 확률: \(0.7p\)
따라서 \(0.6(1-p) + 0.3p = p\)
풀어보면 \(0.6/1.3 =p\)
0.6/1.3
0.4615384615384615
풀이4
True)[1:]) np.mean(doctor_strange(
0.462