Hoo*_*ked 4 python markov-chains scipy
鉴于以下马尔可夫矩阵:
import numpy, scipy.linalg
A = numpy.array([[0.9, 0.1],[0.15, 0.85]])
Run Code Online (Sandbox Code Playgroud)
静止概率存在且等于[.6, .4].通过采用矩阵的大功率,这很容易验证:
B = A.copy()
for _ in xrange(10): B = numpy.dot(B,B)
Run Code Online (Sandbox Code Playgroud)
在这里B[0] = [0.6, 0.4].到现在为止还挺好.根据维基百科:
静态概率向量被定义为在应用转移矩阵时不改变的向量; 也就是说,它被定义为与特征值1相关的概率矩阵的左特征向量:
所以我应该能够计算特征值为1 的左特征向量A,这也应该给出我的平稳概率.Scipy的实现eig有一个左关键字:
scipy.linalg.eig(A,left=True,right=False)
Run Code Online (Sandbox Code Playgroud)
得到:
(array([ 1.00+0.j, 0.75+0.j]), array([[ 0.83205029, -0.70710678],
[ 0.5547002 , 0.70710678]]))
Run Code Online (Sandbox Code Playgroud)
其中主要的左特征向量是:[0.83205029, 0.5547002].我读错了吗?如何[0.6, 0.4]使用特征值分解?
这[0.83205029, 0.5547002]只是[0.6, 0.4]乘以~1.39.
虽然从"物理"的角度来看,你需要特征向量,其组件的总和等于1,但是通过某个因子缩放特征向量并不会改变它的"本征性":
如果
,显然 
所以,要让[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])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2588 次 |
| 最近记录: |