为隐马尔可夫模型创建一个转移矩阵

问题描述

我有一个 30x30 的网格,它被离散成 1x1,900 个单元格。并且从特定单元格向上、向下、向左和向右移动一级的概率分别为0.4、0.1、0.2、0.3。我想初始化 900x900 的转移概率矩阵,其中 900 表示隐藏状态/单元格。在一行中,大多数值将为零,最多只有 4 列将被初始化。关于如何编写代码来初始化这样一个矩阵的任何帮助都会有所帮助。谢谢。

解决方法

让我们从存储在转换矩阵中 (i,j) 位置的某个初始状态开始。我们可以定义向左移动的概率为P((i,j+1),(i,j)),向右移动的概率为P((i,j+2),j)),向上为 P((i,j-2),j)),向下为 P((i,j-1),j))。那么我们需要做的就是

def kth_diag_indices(A: ndarray,offset: int)-> ndarray:
    return np.where(np.eye(A.shape[0],k=offset) == 1)

n_states = 30
P = np.zeros((n_states,n_states))
P[kth_diag_indices(P,-2)] = 0.4 # up
P[kth_diag_indices(P,-1)] = 0.1 # down
P[kth_diag_indices(P,1)] = 0.2 # left
P[kth_diag_indices(P,2)] = 0.3 # left

请注意,主对角线保持为零,因为您提供的概率之和为 1,这意味着如果转换矩阵要保持随机,则 P((i,j),j)) = 0。此外,该定义中的 0th 行不能向上或向下移动,并且 nth 不能向左移动或对,这并不理想。如果您想要不同的行为,您需要以不同的方式定义您的转换矩阵,但您可以使用此处描述的相同原则。