leftEigenvector = scipy.linalg.eig(A,left=True,right=False)[1][:,0]
leftEigenvector = leftEigenvector / sum(leftEigenvector)
[:,0]
位置上的元素可能不是正确特征值对应的特征向量(在我的情况中通常不是),因此 is close
,但通常并不适用。
好的,但是 scipy.linalg.eig(A,left=True,right=False)
的输出是一个数组,其中 [0]
元素是每个特征值(无序)的列表,并且根据相应的顺序在位置 [1]
后跟随一个特征向量数组。
我不知道如何从整个数组中按特征值排序或搜索以提取正确的特征向量(所有特征值为1的特征向量都除以向量元素之和标准化)。 我的想法是获取等于1的特征值的索引,然后从特征向量数组中提取这些列。 我的版本比较慢且繁琐。 首先我有一个函数(不完全有效),可以找到与给定值匹配的位置。
# Find the positions of the element a in theList
def findPositions(theList, a):
return [i for i, x in enumerate(theList) if x == a]
然后我用它这样的方式获取与特征值 = 1 匹配的特征向量。
M = transitionMatrix( G )
leftEigenvectors = scipy.linalg.eig(M,left=True,right=False)
unitEigenvaluePositions = findPositions(leftEigenvectors[0], 1.000)
steadyStateVectors = []
for i in unitEigenvaluePositions:
thisEigenvector = leftEigenvectors[1][:,i]
thisEigenvector / sum(thisEigenvector)
steadyStateVectors.append(thisEigenvector)
print steadyStateVectors
但实际上这并不起作用。有一个特征值=1.00000000e+00 +0.00000000e+00j
,即使找到了其他两个特征值也没有找到。
我希望我不是第一个使用Python查找马尔可夫模型的稳态分布的人。或许有更熟练/经验丰富的人已经找到了通用解决方案(无论是使用NumPy还是SciPy)。考虑到马尔可夫模型有多受欢迎,我期望有一个专门用于执行此任务的库,也许它存在,但我找不到。
x < a + epsilon && x > a - epsilon
这样的表达式,其中epsilon是一个适当的小数。 - Marco Tompitak