📜  马尔可夫链(1)

📅  最后修改于: 2023-12-03 14:58:50.449000             🧑  作者: Mango

马尔可夫链介绍

马尔可夫链(Markov Chain)是一种随机过程,其状态转移概率只与前一状态有关,与更早的状态无关。马尔可夫链可以用来模拟一些随机现象,如随机游走、自然语言处理、图像压缩等。

怎样定义马尔可夫链

定义一个马尔可夫链需要以下几个要素:

  1. 状态空间S:描述系统所有可能的状态,例如,用一个序列纪录一段文本中的单词,每个单词则是状态空间的一个元素。

  2. 转移概率矩阵P:描述状态之间的转移概率,即,从一个状态i转移到另一个状态j的概率为P(i,j)。对于一个长度为N的状态序列 {s1, s2, …, sN},它的概率为P(s1,s2) * P(s2,s3) * … * P(sN-1, sN)。

  3. 初始状态分布向量π:描述初始状态的概率分布,即,系统在初始时刻处于状态i的概率为π(i)。

在Python中,可以使用 numpy 库来处理矩阵,用列表来表示概率分布向量。

import numpy as np

# 状态空间
state_space = ['A', 'B', 'C', 'D']
# 转移概率矩阵
P = np.array([[0.6, 0.2, 0.1, 0.1],
              [0.3, 0.4, 0.2, 0.1],
              [0.1, 0.2, 0.4, 0.3],
              [0.2, 0.1, 0.3, 0.4]])
# 初始状态分布向量
pi = np.array([0.25, 0.25, 0.25, 0.25])
马尔可夫链的应用
随机游走

随机游走是一种随机漫步的过程,在数学上用马尔可夫链来建模。在一维的空间中,游走者从一个点出发,以等概率向左或向右移动,假设每步的长度相同,或者各步的长度服从相同分布。那么,这个过程可用下面的概率矩阵所描述:

$$ P = \begin{bmatrix} 0 & 1 & 0 & 0 & 0 \ 1/3 & 0 & 2/3 & 0 & 0 \ 0 & 2/3 & 0 & 1/3 & 0 \ 0 & 0 & 1 & 0 & 0 \ 0 & 0 & 0 & 1 & 0 \ \end{bmatrix} $$

也就是说,如果当前的状态是第二个位置(从0开始),则下一步可能向左移动到第一个位置(概率为1/3),或向右移动到第三个位置(概率为2/3)。

# 随机游走示例
state_space = ['0', '1', '2', '3', '4'] # 状态空间
P = np.array([[0, 1, 0, 0, 0],
              [1/3, 0, 2/3, 0, 0],
              [0, 2/3, 0, 1/3, 0],
              [0, 0, 1, 0, 0],
              [0, 0, 0, 1, 0]]) # 转移矩阵
pi = [0.2, 0.2, 0.2, 0.2, 0.2] # 初始状态向量

def random_walk(times, state_space, P, pi):
    current_state = np.random.choice(state_space, p=pi) # 从初始状态中随机选择一个状态
    res = [current_state]
    for i in range(1, times):
        prob = P[state_space.index(current_state), :] # 获取当前状态的概率分布向量
        current_state = np.random.choice(state_space, p=prob) # 从当前状态的概率分布中随机选择一个状态
        res.append(current_state)
    return res
        
res = random_walk(100, state_space, P, pi) # 进行100步随机游走
print(res) # 输出随机游走的结果
自然语言处理

马尔可夫链在自然语言处理中有广泛应用,用于实现自动对生成文本进行分类或生成新的文本。一个字符序列或单词序列可以被视为马尔可夫链的状态空间,序列中每个字符或单词被视为状态,转移概率可以使用n-gram模型来估计,初始状态分布可以使用计算训练数据中的频率得到。

# 自然语言处理示例
state_space = ['I', 'like', 'to', 'eat', 'apples', 'and', 'bananas'] # 状态空间
P = np.array([[0.0, 0.5, 0.2, 0.1, 0.2, 0.0, 0.0],
              [0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0],
              [0.0, 0.0, 0.0, 0.6, 0.0, 0.4, 0.0],
              [0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.5],
              [0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5],
              [0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5],
              [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]]) # 转移矩阵
pi = [0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.0] # 初始状态向量

def generate_text(N, state_space, P, pi):
    current_state = np.random.choice(state_space, p=pi) # 从初始状态中随机选择一个状态
    res = [current_state]
    for i in range(1, N):
        prob = P[state_space.index(current_state), :] # 获取当前状态的概率分布向量
        current_state = np.random.choice(state_space, p=prob) # 从当前状态的概率分布中随机选择一个状态
        res.append(current_state)
    return ' '.join(res)
        
text = generate_text(10, state_space, P, pi) # 生成10个单词的文本
print(text) # 输出生成的文本
总结

马尔可夫链是一种随机过程,它的状态转移概率只与前一状态有关,与更早的状态无关。马尔可夫链可以用来模拟一些随机现象,如随机游走、自然语言处理、图像压缩等。在Python中,可以使用 numpy 库来处理矩阵,用列表来表示概率分布向量。