행렬 응용 : Stochastic Process(확률과정)
▶확률과정(Stochastic Process)
- 시간의 흐름에 따라 변하는 어떤 system을 각 시점에서 나타내는 수치적인 양을 확률변수라 기술, 이 확률변수들을 시간 흐름별로 나열한 집합을 확률과정이라 함.
- 시간의 흐름이 이산적일 때, 어떤 분포를 따르는 확률변수들의 모임 $\{X_n, n \in N \}$을 이산형(discrete) 확률과정 (stochastic process)라 부른다. (연속적일 때는 연속시간 확률과정)
- 확률과정은 상관관계를 가지는 무한개의 확률변수의 순서열을 말함.
- 베르누이 확률분포는 가장 간단한, 대표적인 확률과정이다.
- 예를 들면, i.i.d. 인 확률변수 $\{X_n, n \in N\}$들의 모임은 확률과정이며, i.i.d 과정이라고도 부른다.
- $n$은 보통 시간(time)의 의미로 해석하면 편리하며, 집합 $N$은 주로 $N = \{0, 1, \cdots\}$인 경우를 많이 다루게 된다. 이때, $X_0$은 초기상태 (initial state)를 의미한다.
- 확률과정 $\{X_n, n \in N\}$에서 $X_n$들이 취하는 값을 상태(state), 상태들의 전체모임을 상태공간(state space)이라 부르며, $S$로 표기한다.
- 임의보행(random walk) : $X_n, n = 1, 2, \cdots$이 i.i.d. 과정일 때, $S_0 = x, \,\, S_n = S_0 + X_1 + \cdots + X_n (n = 0, 1, 2, \cdots)$으로 정의되는 확률과정 $\{S_n, n \geq 0\}$을 $x$에서 출발하는 임의보행(random walk)이라 부른다. $$ P(X_n = 1) = p, \quad P(X_n = -1) = q, \quad p + q = 1$$
- $k$가 자연수일 때 $S_0 = k$라면, $S_n = S_0 + X_1 + \cdots + X_n$의 상태공간은 정수 집합이 된다.
▶ 임의보행 :
- A와 B가 동전 던지기 게임을 한다고 하자. 동전을 한번 던졌을 때, 앞면이 나오면 A가 1점을 얻고, B는 1점을 잃는다. 뒷면이 나오면 A가 1점을 잃고, B가 1점을 얻게 된다. A와 B가 각각 0점으로부터 시작해서 동전을 50번 던지는 경우, A의 누적점수를 알아보고자 한다.
→ 동전을 각 시행마다 얻는 점수를 $X_i$라고 하면, $k$번 시행 후 누적된 점수는 $S_k = \sum_{i=1}^k X_i$로 표현할 수 있다. 이를 코드로 살펴보면 아래와 같다
# stochastic process
import random
import numpy as np
lst = [-1, 1]
win = np.random.choice(lst, 50, p = [0.5, 0.5])
win
# array([-1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1,
# 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1,
# 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, 1])
cum_win = np.cumsum(win)
cum_win
# array([-1, 0, -1, -2, -1, 0, 1, 2, 3, 2, 3, 4, 3, 4, 5, 6, 5,
# 6, 5, 6, 7, 8, 9, 8, 9, 10, 9, 8, 9, 10, 11, 12, 11, 10,
# 11, 12, 13, 12, 13, 12, 11, 10, 9, 8, 7, 8, 7, 6, 7, 8],dtype=int32)
cum_win[-1] # 8
→ 표본공간의 한 원소 $w$를 고정시키고, 이에 대응되는 확률과정의 관측치 $\{W_n(w), n \in N\}$를 생각하면 시간 $n$의 함수가 되며, 이를 그 $w$에 대응되는 표본 경로(Sample Path) 또는 경로(Path)라 부른다.
import matplotlib.pyplot as plt
import random
# Initialise the subplot function using number of rows and columns
figure, axis = plt.subplots(2, 2)
lst = [-1, 1]
i, j = 0, 0
PLOTS_PER_ROW = 2
for k in range(4):
win = np.random.choice(lst, 50, p = [0.5, 0.5])
cum_win = np.cumsum(win)
axis[i][j].plot(cum_win)
j += 1
if j % PLOTS_PER_ROW == 0:
i += 1
j = 0
plt.show()
- A와 B가 동전 던지기 게임을 한다고 하자. 동전을 한번 던졌을 때, 앞면이 나오면 A가 1점을 얻고, B는 1점을 잃는다. 뒷면이 나오면 A가 1점을 잃고, B가 1점을 얻게 된다. A와 B가 각각 0점으로부터 시작해서 동전을 50번 던지는 경우, A의 누적점수가 0점이 될 확률 $P(S_{50}=0)0$은?
For a walk of no steps : $P_0(0) = 1$
For a walk of one step : $P_1(-1) = \frac{1}{2}, P_1({1}) = \frac{1}{2}$
For a walk of two steps : $P_2(-2) = \frac{1}{4}, P_2({0}) = \frac{1}{2}, P_2({2}) = \frac{1}{4}$
$\vdots$
→ 따라서, 확률변수 $S_n$을 N번의 시행 후의 누적점수라 하고, $Y \sim Binomial(n, 1/2)$라고 하면, $S_n = 2Y - n$이며 $S_n$의 상태공간은 $\{-n, 2-n, 4-n, \cdots, n\}$이다. $$ P(S_n = k) = P(2Y-n = K) = P(Y = (n+k)/2) = \binom{n}{\frac{n+k}{2}} (\frac{1}{2})^n $$
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np
def win_func(n):
win = np.random.choice([-1, 1], n, p = [0.5, 0.5])
cum_win = np.sum(win)
return(cum_win)
replicate = list(map(lambda x: win_func(50), range(1000)))
freq = Counter(replicate)
for k in freq:
freq[k]/= 1000 # for probability
plt.bar(freq.keys(), freq.values())
따라서, $P(S_{50})$은 전체 $S_{50}$ 중 $S_{50} = 0$에 해당하는 값들의 sum / 1000이 되며, 여기에서는 freq[freq.keys()==0]/1000 = 0.112로 계산된다.