Python的numpy/scipy特征向量似乎不适用于马尔可夫链模型



我有一个大的(351351)numpy转换矩阵。我想用numpy找到状态状态向量(我也试过scipy,它有同样的精确函数)。

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

因此,我认为这应该给我优势左特征值的特征向量。主左特征值为1+0j。这在一定程度上是正确的,主左特征值应该是1,我对此有点陌生,所以我不知道该怎么处理虚数。此外,sstate矢量包含所有复数。现在,为了检查这是否正确,我做了以下矩阵乘法:

np.dot(sstate,T)

如果操作正确,这将返回与"sstate"相同的矢量我不知道为什么这不起作用。虚数会是问题吗?此外,这个转移矩阵是否可能不包含稳态向量。我的转换状态矩阵中的每一行和每一列都应该求和为1,然而,我发现舍入误差导致每一行的和和和只大约为1。

感谢您的帮助!

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

也可能是sstate = sstate/sstate.sum(),以确保概率总和为1,尽管进行了四舍五入。

下面是numpy的一个例子。

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

eig和类似的东西将计算特征向量,如在向量v中,使得标量lambdaAv = (lambda)v。不过,你需要的是A特征向量,所以满足v.T*A = (lambda)v.T的东西,这不仅仅是右特征向量的转置或共轭。

因此,您将希望基于A.T来计算特征向量,但稍后在检查状态向量是否真的是静止的时,将不希望使用A.T来计算。您将需要查看np.dot(sstate, T)(验证sstate是行向量,而不是列),并对其进行评估(可能还有关于重新规范化的另一点,以帮助求四舍五入)。

因此查看从对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安装程序包括一个通用的BLAS,如果它不在机器上的话

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

相关内容

  • 没有找到相关文章