Scipy中的左特征向量不能给出正确的(马尔可夫)稳态概率

4

给定以下马尔可夫矩阵:

import numpy, scipy.linalg
A = numpy.array([[0.9, 0.1],[0.15, 0.85]])

固定概率存在且等于[.6, .4]。通过对矩阵进行大幂次运算可以轻松验证此结果。
B = A.copy()
for _ in xrange(10): B = numpy.dot(B,B)

这里 B[0] = [0.6, 0.4]。到目前为止还不错。根据wikipedia的说法:

静态概率向量被定义为一个向量,在转移矩阵的应用下不会改变;也就是说,它被定义为概率矩阵的左特征向量,与特征值1相关:

所以我应该能够计算具有特征值1的A左特征向量,这也应该给我静态概率。 Scipy的实现eig有一个左关键字:

scipy.linalg.eig(A,left=True,right=False)

给出:

(array([ 1.00+0.j,  0.75+0.j]), array([[ 0.83205029, -0.70710678],
   [ 0.5547002 ,  0.70710678]]))

这里说的主左特征向量是:[0.83205029, 0.5547002]。我有没有读错?如何使用特征值分解得到[0.6, 0.4]

2个回答

8
[0.83205029, 0.5547002]只是[0.6, 0.4]乘以约1.39得到的。
虽然从“物理”角度来看,需要特征向量其组成部分之和等于1,但通过某个因子缩放特征向量不会改变其“特征性”
如果\vec{v} A = \lambda \vec{v},那么显然(\alpha \vec{v}) A = \lambda (\alpha \vec{v})
因此,要得到[0.6, 0.4],您应该执行:
>>> v = scipy.linalg.eig(A,left=True,right=False)[1][:,0]
>>> v
array([ 0.83205029,  0.5547002 ])
>>> v / sum(v)
array([ 0.6,  0.4])

当然。R(ing)TFM显示eig返回归一化的向量。在我的脑海中,我期望得到一个归一化的概率分布(L1范数),而scipy给出了更明显的平方和的平方根(L2范数)。回想起来,我应该注意到两个组件的比率在两种情况下是相同的。谢谢! - Hooked

0

eig函数就是计算特征向量,返回的结果是关于特征向量的单位向量

所以,如果我们取v = [0.6, 0.4],它的长度可以表示为: l = np.sqrt(np.square(a).sum()) 或者 l = np.linalg.norm(v),因此,从scipy.linalg.eig函数返回的标准化向量就是:

>>> v = np.array([.6, .4])
>>> l = np.sqrt(np.square(a).sum())
>>> v / l
array([0.83205029, 0.5547002 ])

因此,如果您需要向量成为马尔可夫链中的随机向量概率向量,只需将其缩放,使其总和为1.0即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接