目录
1. 马尔可夫链
2. 马尔可夫链示例
3. 马尔可夫链的状态转移矩阵
马尔可夫链(Markov Chain, MC)是概率论和数理统计中具有马尔可夫性质(Markov property)且存在于离散的指数集(index set)和状态空间(state space)内的随机过程(stochastic process)。即状态空间从一个状态到另一个状态的转换的随机过程。这个过程要求具备“无记忆”的性质,换句话说就是,下一状态的概率分布只能由当前状态决定,与时间序列中当前状态之前的事件都无关(马尔可夫性质)。
对于马尔可夫链中的每一步,系统都会根据概率分布,从一个状态变到另一个状态,也可以保持当前状态。状态的改变叫做转移,状态改变的概率叫做转移概率。因此,马尔科夫链可以概况为某一时刻状态转移的概率只依赖于它的前一个状态。
以天气为例,假设天气的变化为马尔可夫链,那么明天的天气只依赖于今天的天气,而与昨天的天气无关。当然这种假设可能忽略掉了很多天气变化的历史信息,但优势是这种假设使得天气更容易建模,大大简化了模型的复杂度。
上面这个模型表示简化后的天气模型,假设天气只有晴、阴、雨三种状态,每一个状态都以一定的概率转化到下一个状态。这个状态概率转化图可以以矩阵的形式表示,定义矩阵阵 P 某一位置 P(i, j) 的值为 P(j|i),即从状态 i 变为状态 j 的概率。
只要这个状态转移矩阵 P 确定,天气模型就可以确定了。
以天气模型为例,假设今天有30%的可能性为晴天,20%的可能性为阴天,50%的可能性为雨天。则初始状态为 t0 = [0.3, 0.2, 0.5],然后可以计算之后每天的天气状态。
import numpy as np
class MarkovChain:
def __init__(self, init_status: np.array, transfer_matrix: np.array) -> None:
self.init_status = init_status
self.transfer_matrix = transfer_matrix
def get_status(self, transfer_num: int) -> np.array:
current_status = self.init_status
for _ in range(transfer_num):
current_status = np.dot(current_status, self.transfer_matrix)
return current_status
def to_percentage(num):
return int(num * 1000) / 10
if __name__ == "__main__":
t0 = np.array([0.3, 0.2, 0.5])
matrix = np.array([[0.8, 0.15, 0.05],
[0.2, 0.45, 0.35],
[0.1, 0.5, 0.4]])
markov = MarkovChain(t0, matrix)
for i in range(20):
prob_array = markov.get_status(i)
sunny, cloudy, rainy = prob_array[0], prob_array[1], prob_array[2]
print("晴天的概率是:{}%, 阴天的概率是:{}%, 雨天的概率是:{}%".format(
to_percentage(sunny), to_percentage(cloudy), to_percentage(cloudy)))
运行结果
晴天的概率是:30.0%, 阴天的概率是:20.0%, 雨天的概率是:20.0%
晴天的概率是:33.0%, 阴天的概率是:38.5%, 雨天的概率是:38.5%
晴天的概率是:36.9%, 阴天的概率是:36.5%, 雨天的概率是:36.5%
晴天的概率是:39.5%, 阴天的概率是:35.2%, 雨天的概率是:35.2%
晴天的概率是:41.1%, 阴天的概率是:34.4%, 雨天的概率是:34.4%
晴天的概率是:42.2%, 阴天的概率是:33.8%, 雨天的概率是:33.8%
晴天的概率是:42.9%, 阴天的概率是:33.5%, 雨天的概率是:33.5%
晴天的概率是:43.4%, 阴天的概率是:33.2%, 雨天的概率是:33.2%
晴天的概率是:43.7%, 阴天的概率是:33.1%, 雨天的概率是:33.1%
晴天的概率是:43.9%, 阴天的概率是:33.0%, 雨天的概率是:33.0%
晴天的概率是:44.0%, 阴天的概率是:32.9%, 雨天的概率是:32.9%
晴天的概率是:44.1%, 阴天的概率是:32.9%, 雨天的概率是:32.9%
晴天的概率是:44.1%, 阴天的概率是:32.9%, 雨天的概率是:32.9%
晴天的概率是:44.2%, 阴天的概率是:32.8%, 雨天的概率是:32.8%
晴天的概率是:44.2%, 阴天的概率是:32.8%, 雨天的概率是:32.8%
晴天的概率是:44.2%, 阴天的概率是:32.8%, 雨天的概率是:32.8%
晴天的概率是:44.2%, 阴天的概率是:32.8%, 雨天的概率是:32.8%
晴天的概率是:44.2%, 阴天的概率是:32.8%, 雨天的概率是:32.8%
晴天的概率是:44.2%, 阴天的概率是:32.8%, 雨天的概率是:32.8%
晴天的概率是:44.2%, 阴天的概率是:32.8%, 雨天的概率是:32.8%
只要状态转移矩阵确定了,不论初始状态怎么变化,当状态转移的次数趋于无穷的时候,最终状态都会收敛到一个固定的值。