鉴于以下马尔可夫矩阵:
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]
。到现在为止还挺好。根据{{3}}:
静态概率向量定义为在应用转移矩阵时不变化的向量;也就是说,它被定义为概率矩阵的左特征向量,与特征值1相关:
所以我应该能够计算A
的左特征向量,特征值为1,这也应该给出我的平稳概率。 wikipedia有一个左关键字:
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]
?
答案 0 :(得分:8)
[0.83205029, 0.5547002]
只是[0.6, 0.4]
乘以~1.39。
虽然从“物理”的角度来看,你需要特征向量,其组件总和等于1,scaling eigenvector by some factor does not change it's "eigenness":
如果是,那么显然是
所以,要获得[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])
答案 1 :(得分:0)
就本征向量而言,eig
函数返回单位向量。
所以,如果我们采取
v = [0.6, 0.4]
,其 length 为:
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