我有一个大的(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
中,使得标量lambda
的Av = (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;它要快得多,尤其是在你的情况下,因为你只想要一个特征向量。