我试图理解如何在这篇paper(第5页)中实现方程(6)。等式是这样的:
C、P 是 HMM 中的发射矩阵和状态转移矩阵。目标是计算 N。
这是我使用的代码:
import numpy as np
from scipy.linalg import null_space
n = 4
P = np.array([[1/2, 0, 1/3, 1/4], [0, 1/3, 1/3, 1/4], [1/2, 0, 1/3, 0], [0, 2/3, 0, 1/2]])
C = np.array([[1/4, 1/4, 1/2, 7/16], [3/4, 3/4, 1/2, 9/16]])
N = C
for i in range(1, n):
N = np.vstack((N, np.dot(C, np.linalg.matrix_power(P, i))))
ns = null_space(N)
print(ns)
代码的结果与论文中的结果不同:
[[ 0.71204526 0.05287224]
[-0.69918134 0.14473901]
[ 0.03859176 0.59283375]
[-0.05145569 -0.790445 ]]
我做错了什么以及如何解决?
您在这里缺少的是
kernel
操作。还引用您分享的文章:
子空间N可以表征为最大的P不变量 ker C
中包含的子空间
好吧,这是什么意思:
找到
C*x = 0
的所有向量 x。假设这是 {x1,x2,x3,...}。这称为 ker(C) 向量。 IE。 ker(C) = {x | C*x=0}
。
现在您需要从 ker(C) 中找到所有 x,使任何 p 都成为
C*P^n * x= 0
。这就是你找到 N 的方法。所以 N = {x | C*P^n * x= 0, for all n, and x from ker(C)}