【问题标题】:Left eigenvectors not giving correct (markov) stationary probability in scipy左特征向量在 scipy 中没有给出正确的(马尔科夫)平稳概率
【发布时间】:2012-05-08 18:16:24
【问题描述】:

给定以下马尔可夫矩阵:

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]。到现在为止还挺好。根据wikipedia

平稳概率向量被定义为在转移矩阵的应用下不改变的向量;即定义为概率矩阵的左特征向量,与特征值1相关联:

所以我应该能够计算特征值为 1 的 Aleft 特征向量,这也应该给我平稳概率。 Scipy's implementation of eig 有一个左关键字:

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]

【问题讨论】:

    标签: python scipy markov-chains


    【解决方案1】:

    [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])
    

    【讨论】:

    • 哦,当然。 R(ing)TFM 表明 eig 返回归一化的向量。在我的脑海中,我期待一个归一化的概率分布(L1 范数),而 scipy 给出了更明显的平方和(L2 范数)。事后看来,我应该注意到两种成分的比例在两种情况下都是相同的。谢谢!
    【解决方案2】:

    就特征向量而言,eig 函数返回单位向量

    所以,如果我们采取 v = [0.6, 0.4],其长度为: 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 2015-06-18
      相关资源
      最近更新 更多