У меня возникла небольшая проблема с переходами в цепочке Маркова, когда условные вероятности, которые описывают переходы, имеют более одной значащей цифры. Например, если условные вероятности:
eps_a <- 0.3 # Pr(a leaves)
eps_b <- 0.4 # Pr(b leaves)
gam_c <- 0.2 # Pr(c arrives)
eps_b_a <- 0.4 # Pr(b leaves | a)
gam_c_a <- 0.9 # Pr(c arrives | a)
eps_a_b <- 0.2 # Pr(a leaves | b)
gam_c_b <- 0.9 # Pr(c arrives | b)
gam_c_ab <- 0.7 # Pr(c arrives | ab)
А переходы между 8 различными состояниями:
tm <- rep(0,8)
# Assuming AB was state in last time step
tm[1] <- eps_a * eps_b * (1 - gam_c) #----------------------|U
tm[2] <- (1 - eps_a) * eps_b_a * (1 - gam_c_a) #------------|A
tm[3] <- eps_a_b * (1 - eps_b) * (1 - gam_c_b) #------------|B
tm[4] <- eps_a * eps_b * gam_c #----------------------------|C
tm[5] <- (1 - eps_a_b) * (1 - eps_b_a) * (1 - gam_c_ab) #---|AB
tm[6] <- (1 - eps_a) * eps_b_a * gam_c_a #------------------|AC
tm[7] <- eps_a_b * (1 - eps_b) * gam_c_b #------------------|BC
tm[8] <- (1 - eps_a_b) * (1 - eps_b_a) * gam_c_ab #---------|ABC
Тогда tm
сумм до 1.
sum(tm)
[1] 1
Однако, если условные вероятности имеют более значимые цифры (даже на 1 больше), то вероятности перехода больше не составляют 1.
eps_a <- 0.3216542
eps_b <- 0.4123442
gam_c <- 0.2145621
eps_b_a <- 0.4231564
gam_c_a <- 0.9943285
eps_a_b <- 0.2321542
gam_c_b <- 0.9978964
gam_c_ab <- 0.7777662
При использовании этих условных вероятностей переходы в tm
теперь суммируются с 0,9990323. Используя другие числа, я видел, что они колеблются между 0,97 и 1,08. Я думал, что это может быть проблемой недостаточного значения, но суммирование журналов этих вероятностей также не исправляет это.
# Using the probabilities with more digits above.
tm_log <- rep(0,8)
tm_log[1] <- log(eps_a) + log(eps_b) + log((1 - gam_c)) #------------------|U
tm_log[2] <- log(1 - eps_a) + log(eps_b_a) + log(1 - gam_c_a) #------------|A
tm_log[3] <- log(eps_a_b) + log(1 - eps_b) + log(1 - gam_c_b) #------------|B
tm_log[4] <- log(eps_a) + log(eps_b) + log(gam_c) #------------------------|C
tm_log[5] <- log(1 - eps_a_b) + log(1 - eps_b_a) + log(1 - gam_c_ab) #-----|AB
tm_log[6] <- log(1 - eps_a) + log(eps_b_a) + log(gam_c_a) #----------------|AC
tm_log[7] <- log(eps_a_b) + log(1 - eps_b) + log(gam_c_b) #----------------|BC
tm_log[8] <- log(1 - eps_a_b) + log(1 - eps_b_a) + log(gam_c_ab) #---------|ABC
sum(exp(tm_log))
[1] 0.9990323
Это наводит меня на мысль, что я либо неправильно кодировал вероятности перехода, либо есть другая проблема, о которой я не знаю. Я всегда мог вычислить один из переходов как 1 минус сумму всех остальных, это единственный способ обойти это?