07wk-2: 마코프체인 (3)

최규빈

2023-04-13

강의영상

youtube: https://youtube.com/playlist?list=PLQqh36zP38-zAMowm9anbqZG0fCAmFI_1

import

import numpy as np
import matplotlib.pyplot as plt
def rain(before):
    if before == True: # 비가 왔음 
        after = np.random.rand() < 0.9
    else: # 비가 안왔음 
        after = np.random.rand() < 0.2 
    return after 
def doctor_strange(X0): # X0=today 
    lst = [X0]
    for i in range(10000): 
        lst.append(rain(lst[i]))
    return lst 

날씨모형 리뷰

formular

- 저번시간에 살펴본 날씨모형은 결국 아래와 같은 모형이었다.

[P(Xt+1=0)P(Xt+1=1)]=[0.80.10.20.9][P(Xt=0)P(Xt=1)]

양변에 트랜스포즈를 취하게 되면

[P(Xt+1=0)P(Xt+1=1)]=[P(Xt=0)P(Xt=1)][0.80.20.10.9]

수식화하면 아래와 같이 된다. (보통 이러한 형태로 책에 많이 쓰니까 이 형태로 외울것!)

μt+1=μtP

참고: Xt는 0 혹은 1의 값을 가질수 있는데, 이렇게 Xt가 가질 수 있는 값들을 모은 공간을 상태공간이라고 하고 기호로는 V={0,1}와 같이 표현한다.

참고: 여기에서 확률과정 {Xt}는 이전시점의 값 Xt1에 의하여서만 결정된다. 이러한 확률과정을 마코프체인이라고 한다.

참고: 이때 매트릭스 P를 transition matrix 라고 한다.

- P의 의미 ()

P의 각 원소를 아래와 같이 두자.

  • P=[p00p01p10p11]

P(i,j)의 원소는 ij로 이동할 확률을 의미한다. 즉 p00, p01, p10, p11 은 각각 아래를 의미한다.

  • p00: 00일 확률. 즉 P(Xt=0|Xt1=0)
  • p01: 01일 확률. 즉 P(Xt=1|Xt1=0)
  • p10: 10일 확률. 즉 P(Xt=0|Xt1=1)
  • p11: 11일 확률. 즉 P(Xt=1|Xt1=1)

- μ의 의미 ()

  • μtXt의 pmf를 의미한다.
  • μ0X0의 pmf를 의미한다. 즉 초기분포를 의미한다.
  • μ자체가 어떠한 분포를 의미한다.

특징들

- 특징1: P는 수렴한다. 즉 P가 존재한다.

P = np.array([[0.8, 0.2],[0.1, 0.9]])
P
array([[0.8, 0.2],
       [0.1, 0.9]])
np.linalg.matrix_power(P,1),np.linalg.matrix_power(P,10),np.linalg.matrix_power(P,30),np.linalg.matrix_power(P,50)
(array([[0.8, 0.2],
        [0.1, 0.9]]),
 array([[0.35216502, 0.64783498],
        [0.32391749, 0.67608251]]),
 array([[0.33334836, 0.66665164],
        [0.33332582, 0.66667418]]),
 array([[0.33333335, 0.66666665],
        [0.33333333, 0.66666667]]))
Plim = np.linalg.matrix_power(P,100)

- 특징2: P의 each column은 모두 동일한 값을 가진다. μ에 어떠한 값을 넣어도 μP=π=[1/3,2/3] P의 아무 row 나 선택하여 그것을 π라고 두자. πX의 pmf가 된다.

μ = np.array([[0.5],[0.5]]) 
μ.T @ Plim
array([[0.33333333, 0.66666667]])
π = np.array([1/3,2/3]).reshape(2,1)
π
array([[0.33333333],
       [0.66666667]])
  • X={0w.p. 1/31w.p. 2/3

참고: 여기에서 π를 확률과정 {Xt}의 정상분포 (stationary distribution) 라고 한다.

- 특징3: πP=π 가 성립한다.

  • 근데 이건 왜 이러지?
π.T @ P
array([[0.33333333, 0.66666667]])

당연히 다른 분포 μ에 대하여서는 성립하지 않음

μ = np.array([[0.5],[0.5]]) 
μ.T @ P
array([[0.45, 0.55]])

참고: 여기에서 수식 πP=π 자체가 정상분포의 정의가 된다. 즉 마코프체인 {Xt}의 트랜지션 매트릭스가 P일때, πP=π를 만족하는 π가 존재한다면 π를 확률과정 {Xt}의 정상분포라고 한다.

- 특징4: 초기분포 μ0π로 설정하면 {Xt}는 모든 t에 대하여 동일한 분포를 가진다. (독립은 아니다)

π # 초기분포: X0의 pmf 
array([[0.33333333],
       [0.66666667]])
X0 = np.random.rand() < 2/3
# X0 = np.random.rand() > 0.52941176
arr = np.array([doctor_strange(np.random.rand() < 2/3) for i in range(4305)])
arr
array([[False, False,  True, ...,  True,  True,  True],
       [ True,  True,  True, ...,  True, False, False],
       [ True,  True,  True, ...,  True,  True,  True],
       ...,
       [ True,  True,  True, ...,  True,  True,  True],
       [ True,  True,  True, ..., False, False, False],
       [False,  True, False, ..., False, False, False]])
plt.plot(arr[0][-100:])

arr[:,0]*1
array([0, 1, 1, ..., 1, 1, 0])
arr[:,-1].sum()
2850
arr[:,0].sum()
2840
fig, ax = plt.subplots(3,3)
ax[0][0].hist(arr[:,0]*1,alpha=0.5);
ax[0][1].hist(arr[:,500]*1,alpha=0.5);
ax[0][2].hist(arr[:,1000]*1,alpha=0.5);
ax[1][0].hist(arr[:,1500]*1,alpha=0.5);
ax[1][1].hist(arr[:,2000]*1,alpha=0.5);
ax[1][2].hist(arr[:,2500]*1,alpha=0.5);
ax[2][0].hist(arr[:,3000]*1,alpha=0.5);
ax[2][1].hist(arr[:,3500]*1,alpha=0.5);
ax[2][2].hist(arr[:,4000]*1,alpha=0.5);
fig.tight_layout()

plt.hist(arr[0]*1)
(array([3512.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
        6489.]),
 array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]),
 <BarContainer object of 10 artists>)

특징4의 변형: 초기분포가 π가 아니더라도 적당한 시점 T0 이후에는 {Xt}tT0는 동일한분포를 가진다고 볼 수 있다.

참고: 특징4는 후에 MCMC를 이해하는 중요한 예제가 된다.

특징3을 위한 약간의 해설

편의상 P=P 라고 하자. 이미 살펴본 것 처럼

  • PP=P

가 성립한다. 특징2에서 살펴본것 처럼 임의의 μ에 대하여 μP=π 가 항상 성립함을 확인할 수 있다. 이 수식을 살짝 변형하면

  • μP=π
  • (μP)P=π
  • πP=π

이다. 따라서 특징3이 유도된다.