在 Python 中计算矩阵的零空间

问题描述 投票:0回答:1

我试图理解如何在这篇paper(第5页)中实现方程(6)。等式是这样的:

C、P 是 HMM 中的发射矩阵和状态转移矩阵。目标是计算 N。

我们以本文的示例 4 为例。

论文中的结果给出为:

这是我使用的代码:

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  ]]

我做错了什么以及如何解决?

python numpy math scipy hidden-markov-models
1个回答
0
投票

您在这里缺少的是

kernel
操作。还引用您分享的文章:

子空间N可以表征为最大的P不变量 ker C

中包含的子空间

好吧,这是什么意思:

  1. 首先你需要找到C:的内核

找到

C*x = 0
的所有向量 x。假设这是 {x1,x2,x3,...}。这称为 ker(C) 向量。 IE。
ker(C) = {x | C*x=0}

  1. 从 ker(C) 中找到所有 P 不变的向量:

现在您需要从 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)}

© www.soinside.com 2019 - 2024. All rights reserved.