2번째 편에서는 은닉 마르코프 모형에서 state 별 조건부 확률 결과인 posterior probability (사후확률)에 대한 구체적인 값을 논의 하고자 한다. 이것에 대한 내용을 보면, 조건부 확률을 어떻게 되는지 알수 있을 것이다.
아래에 나오는 그래프와 소스코드를 돌리려면, 아래의 링크의 코드를 먼저 실행 하여야 한다.
https://rdmkyg.blogspot.com/2021/09/hmm-1.html
대상 은닉 마르코프 그래프 (HMM) |
첫번째 위 그래프에 나타난 state 별 조건부 확률로 계산된 사후확률을 보겠다.
은닉 마르코프 모델의 사후 확률 공식은 아래와 같다.
- $p(y_1, y_2, ... , y_t | μ_1, σ_1,μ_2, σ_2, ..., μ_N, σ_{N_t}) = p(y_1, y_2, ... , y_t | μ_1, σ_1,μ_2, σ_2, ..., μ_N, σ_N) $
각 state 별 조건부 확률을 구한다.
head(post_probs)
## state S1 S2 S3 S4 S5
## 1 1 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## 2 3 8.050476e-02 5.091817e-23 9.190871e-01 4.081919e-04 3.476954e-42
## 3 2 2.087371e-05 8.952488e-01 1.047256e-01 4.720777e-06 1.974622e-08
## 4 2 1.809815e-04 8.366994e-01 1.631196e-01 3.302653e-09 1.560618e-10
## 5 2 1.973808e-08 9.999605e-01 3.949828e-05 6.386467e-10 2.429997e-14
## 6 2 2.623790e-10 9.999997e-01 3.013324e-07 1.868057e-14 2.492895e-15
위와 같이 구하면, 소숫점 자릿수가 길게 나와 사후확률을 볼수가 없다. 여기에서 볼수 있는 방법은 아래와 같이 라운드 함수를 이용하여 처리 하면 된다.
head(round(post_probs,2))
## state S1 S2 S3 S4 S5 ## 1 1
1.00
0.00 0.00 0 0 ## 2 3 0.08 0.00
0.92
0 0 ## 3 2 0.00
0.90
0.10 0 0 ## 4 2 0.00
0.84
0.16 0 0 ## 5 2 0.00
1.00
0.00 0 0 ## 6 2 0.00
1.00
0.00 0 0
state는 정해져 있으니, state에 대한 조건부 확률 중에서 가장 큰 값만 가지고 오면 된다.
일반적으로 R에서는 for loop문을 잘 쓰지 않는다. 이유는 속도가 매우 느리기 때문이다. apply Family는 데이터 구조를 매트릭스로 만든 간단 하게 계산 하면 된다. 향후 for loop문과 apply Family의 차이점을 고찰 하여, 포스트 할 예정이다.
# state 상태에 대한 조건부 확률 큰것
post_max <- as.matrix(post_probs[2:6])
post_prob_vt <- apply(post_max,1, max)
round(post_prob_vt,2)
## [1] 1.00 0.92 0.90 0.84 1.00 1.00 1.00 0.79 0.97 0.80 1.00 0.97 0.62 1.00 0.83
## [16] 1.00 1.00 0.98 0.71 0.78 0.99 0.74 0.99 0.96 0.99 0.99 0.96 0.94 1.00 1.00
## [31] 1.00 0.99 0.79 0.85 0.99 1.00 0.99 0.99 1.00 0.93 0.73 0.99 0.74 0.99 0.95
## [46] 1.00 0.97 0.93 0.99 0.99 0.99 0.91 0.98 1.00 1.00 1.00 1.00 0.86 1.00 1.00
소스 코드 내용을 살펴 보면 데이터 구조를 matrix로 만들기 위해 데이터 프래임에서 2:6열을 선택해서 데이터 셋을 만들었다.
apply는 matrix가 주어진 상태에서 열을 계산 "1" , 행을 계산 "2"를 선택하고 함수를 사용하면 되는데, 조건부 확률에서 최대값을 구하기 위해서 max를 넣었다.
이것을 앞서 만들어 놓은 데이터 프레임에 state값을 넣고, state 사후확률 Max 값을 하나로 묶는다. 이러면, 향후 어떤 방법으로 최적화 할 것 인가에 대한 방법이 나올 것이다.
# group 그리프를 그리기 위한 데이터 프레임 작업
df <- data.frame(date = daesang$date,
adjusted = daesang$adjusted,
state = post_probs$state,
post_prob = round(post_prob_vt,2))
head(df)
## date adjusted state post_prob
## 1 2020-06-02 25850 1 1.00
## 2 2020-06-03 25000 3 0.92
## 3 2020-06-04 24700 2 0.90
## 4 2020-06-05 24800 2 0.84
## 5 2020-06-08 24550 2 1.00
## 6 2020-06-09 24450 2 1.00
여기에서 state선택한 것 중에서 확률이 나타 난다. 확률이 낮을 경우에는 state 선택 한 것에 대한 도메인 지식에 의한 분석이 필요하다.
은닉 마르크프 모형의 조건부 확률에 대한 자세한 공식이나 내용을 보고 싶으면 아래를 클릭 하면된다.
댓글 없음:
댓글 쓰기