Python numpy / scipy特征向量似乎对马尔可夫链模型不正确

时间:2015-02-13 02:13:43

标签: python numpy linear-algebra eigenvector markov-chains

我有一个很大的(351,351)numpy转换矩阵。我想使用numpy找到状态向量(我也尝试过具有相同功能的scipy)。

sstate = np.linalg.eig(T)[1][:,0]

所以我认为应该给出主导左特征值的特征向量。优势左特征值是1 + 0j。这有点正确,占优势的左特征值应为1,我对此有点新,所以我不知道如何处理虚数。此外,sstate向量包含所有复数。现在,尝试检查这是否正确,我执行以下矩阵乘法:

np.dot(sstate,T)

如果操作正确,则应该返回与'sstate'相同的向量。我不确定为什么这不起作用。想象中的数字可能是问题吗?此外,该转换矩阵是否可能不包含稳态矢量。我的过渡状态矩阵中的每一行和列应该总和为1,但是,我发现舍入误差导致每行和每列总和只有大约1。

感谢任何和所有帮助!

2 个答案:

答案 0 :(得分:3)

转换矩阵是否对称?如果没有,请考虑检查T.T(转置),因为您需要确保正在查看正确的状态转换:您需要随机矩阵的特征向量,但是几乎所有开箱即用的科学软件包(包括numpy)都默认为计算正确特征向量(这与教科书中的原因相同,你需要通过行向量而不是通常的矩阵列来预乘处理这个东西时的乘法)。

也许还sstate = sstate/sstate.sum()确保概率总和为1,尽管已经结束。

这是an example with numpy.

从评论中添加了关于右侧与左侧特征向量的详细信息:

eig之类的东西会计算正确的特征向量,就像向量v一样,Av = (lambda)v用于标量lambda。你需要的是A特征向量,所以满足v.T*A = (lambda)v.T的东西,这不仅仅是右特征向量的转置或共轭。

因此,您需要根据A.T计算特征向量,但

}您需要查看A.T(验证np.dot(sstate, T)是行向量,而不是列),并评估(并且可能还有关于重新规范化以帮助舍入的另一点)。

答案 1 :(得分:1)

所以看一下从 eig 的调用返回的1D数组(2元组中的第一个元素);这是特征值数组,正如您所看到的那样,它不是按降序排列,您需要手动 排序 ,然后将相同的顺序应用于特征向量数组。您可能已经这样做了,但它不在您的代码段中,也未在OP中提及。

一旦你这样做,那么你可以选择第一个特征向量:

>>> import numpy as NP
>>> from scipy import linalg as LA
>>> a = NP.random.rand(16).reshape(4, 4)

>>> E = LA.eig(a, left=True)

>>> evals, evecs = E

按递减顺序对特征值进行排序

>>> idx = NP.argsort(evals)[::-1]

>>> eva = eva[idx]

将排序索引应用于特征向量矩阵

>>> eva[idx,]

选择第一个

>>> eva[0].real 

另外,使用来自scipy的linalg;如果NumPy安装程序不在机器上,则NumPy安装程序包含一个通用的BLAS

此外,如果传递给 eig 的2D数组稀疏,则使用 scipy.sparse 中的 eig ;它的速度要快得多,尤其如此,因为你只想要一个特征向量。