【问题标题】:Python numpy/scipy eigenvectors seemingly not correct for markov chain modelPython numpy/scipy 特征向量似乎不适合马尔可夫链模型
【发布时间】:2015-02-13 02:13:43
【问题描述】:

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

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

所以我相信这应该给我主要左特征值的特征向量。主要的左特征值为 1+0j。这有点正确,主要的左特征值应该是 1,我对此有点陌生,所以我不确定如何处理虚数。此外,状态向量包含所有复数。现在,尝试检查这是否正确,我执行以下矩阵乘法:

np.dot(sstate,T)

如果操作正确,这应该返回与“sstate”相同的向量。我不确定为什么这不起作用。虚数会是问题吗?另外,这个转移矩阵是否可能不包含稳态向量。我的过渡状态矩阵中的每一行和每一列的总和都应该为 1,但是,我发现舍入误差会导致每一行和每一列的总和约为 1。

感谢所有帮助!

【问题讨论】:

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


    【解决方案1】:

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

    也许还有sstate = sstate/sstate.sum() 以确保尽管四舍五入,概率总和为 1。

    这里是an example with numpy.

    添加了来自 cmets 的左右特征向量的详细信息:

    eig 和类似的东西将计算 right 特征向量,如向量 v 这样Av = (lambda)v 用于标量 lambda。不过,您需要的是A 特征向量,因此满足v.T*A = (lambda)v.T 并且这不仅仅是右特征向量的转置或共轭。

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

    【讨论】:

    • 我刚刚检查过,矩阵不是对称的,这很奇怪,因为它应该是。我必须检查一下。
    • 过渡没有必须是对称的,但它们经常是对称的。例如,我链接到的示例中的那个不是对称的,因为问题状态不是对称的。
    • 哦,好的,在查看数学之后,我的矩阵应该不是对称的。那么这如何导致 numpy/scipy 出现问题呢?
    • 我尝试找到转置转移矩阵 T.T 的稳态向量,但即使这个稳态向量乘以 T.T 仍然不等于自身。
    • eig 和类似的东西将计算 right 特征向量,如向量 v 中的 Av = (lambda)v 用于标量 lambda。你需要的是Aleft特征向量,所以满足v.T*A = (lambda)v.T的东西,这不仅仅是右特征向量的转置或共轭,
    【解决方案2】:

    所以看看调用eig返回的一维数组(2元组中的第一个元素);这是特征值数组,您可以看到它不是按降序排列的,您需要手动对其进行排序,然后将相同的顺序应用于特征向量数组。您可能已经这样做了,但它不在您的代码 sn-p 中,也没有在 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 的二维数组是稀疏的,则使用 scipy.sparse 中的 eig;它要快得多,尤其是在您的情况下,因为您只需要一个特征向量。

    【讨论】:

    • 我使用了正确的特征值,这已经被检查过了。感谢您的回答和提示:)
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多