- Hands-On Markov Models with Python
- Ankur Ankan Abinash Panda
- 511字
- 2021-07-23 19:12:04
Reducibility
A Markov chain is said to be irreducible if we can reach any state of the given Markov chain from any other state. In terms of states, state j is said to be accessible from another state i if a system that started at state i has a non-zero probability of getting to the state j. In more formal terms, state j is said to be accessible from state i if an integer nij ≥ 0 exists such that the following condition is met:

The nij here is basically the number of steps it takes to go from state i to j, and it can be different for different pairs of values for i and j. Also, for a given state i, if all the values for nij = 0, it means that all the states of the Markov chain are directly accessible from it. The accessibility relation is reflexive and transitive, but not necessary symmetric. We can take a simple example to understand this property:

In the previous example, it can be clearly seen that all of the states are accessible from all other states and hence are irreducible.
In the following example, we can see that state D is not accessible from A, B, or C. Also, state C is not accessible from either A or B. But all the states are accessible from state D, and states A and B are accessible from C:

We can also add a couple of methods to our MarkovChain class to check which states in our chain are reachable and whether our chain is irreducible:
from itertools import combinations
def is_accessible(self, i_state, f_state):
"""
Check if state f_state is accessible from i_state.
Parameters
----------
i_state: str
The state from which the accessibility needs to be checked.
f_state: str
The state to which accessibility needs to be checked.
"""
reachable_states = [i_state]
for state in reachable_states:
if state == self.index_dict[f_state]:
return True
else:
reachable_states.append(np.nonzero(
self.transition_matrix[self.index_dict[i_state], :])[0])
return False
def is_irreducible(self):
"""
Check if the Markov Chain is irreducible.
"""
for (i, j) in combinations(self.states, self.states):
if not self.is_accessible(i, j):
return False
return True
Let's give our examples a try using the examples in Figure 1.2 and Figure 1.3:
>>> transition_irreducible = [[0.5, 0.5, 0, 0],
[0.25, 0, 0.5, 0.25],
[0.25, 0.5, 0, 0.25],
[0, 0, 0.5, 0.5]]
>>> transition_reducible = [[0.5, 0.5, 0, 0],
[0, 1, 0, 0],
[0.25, 0.5, 0, 0],
[0, 0, 0.25, 0.75]]
>>> markov_irreducible = MarkovChain(transition_matrix=transition_irreducible,
states=['A', 'B', 'C', 'D'])
>>> markov_reducible = MarkovChain(transition_matrix=transition_reducible,
states=['A', 'B', 'C', 'D'])
>>> markov_irreducible.is_accessible(i_state='A', f_state='D')
True
>>> markov_irreducible.is_accessible(i_state='B', f_state='D')
True
>>> markov_irreducible.is_irreducible()
True
>>> markov_reducible.is_accessible(i_state='A', f_state='D')
False
>>> markov_reducible.is_accessible(i_state='D', f_state='A')
True
>>> markov_reducible.is_accessible(i_state='C', f_state='D')
False
>>> markov_reducible.is_irreducible()
False
- 顯卡維修知識精解
- FPGA從入門到精通(實戰篇)
- 電腦維護與故障排除傻瓜書(Windows 10適用)
- 平衡掌控者:游戲數值經濟設計
- 從零開始學51單片機C語言
- Hands-On Machine Learning with C#
- 計算機組裝與維護(第3版)
- Practical Machine Learning with R
- Java Deep Learning Cookbook
- Python Machine Learning Blueprints
- The Deep Learning with PyTorch Workshop
- FPGA實戰訓練精粹
- 微服務架構基礎(Spring Boot+Spring Cloud+Docker)
- 計算機應用基礎案例教程(Windows 7+Office 2010)
- Advanced Machine Learning with R