找到具有左特征值的马尔可夫稳态(使用 numpy 或 scipy)

2023-12-04

我需要使用一些 python 代码使用其转换矩阵的左特征向量找到马尔可夫模型的稳态。

它已经成立于这个问题scipy.linalg.eig 无法提供所描述的实际左特征向量,但那里演示了修复。像往常一样,官方文档大多无用且难以理解。

比不正确的格式更大的问题是产生的特征值没有任何特定的顺序(没有排序并且每次都不同)。因此,如果您想找到与 1 个特征值相对应的左特征向量,您必须寻找它们,这带来了它自己的问题(见下文)。数学很清楚,但如何让 python 计算它并返回正确的特征向量尚不清楚。这个问题的其他答案,例如this one,似乎没有使用左特征向量,所以这些不是正确的解决方案。

这个问题提供了部分解决方案,但它没有考虑较大转移矩阵的无序特征值。所以,只需使用

leftEigenvector = scipy.linalg.eig(A,left=True,right=False)[1][:,0]
leftEigenvector = leftEigenvector / sum(leftEigenvector)

很接近,但一般不起作用,因为[:,0]位置可能不是正确特征值的特征向量(在我的情况下通常不是)。

好的,但是输出scipy.linalg.eig(A,left=True,right=False)是一个数组,其中[0]element 是每个特征值的列表(不按任何顺序),其后面的位置[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 )。考虑到马尔可夫模型的流行程度,我预计会有一个库专门供它们执行此任务,也许它确实存在,但我找不到。


您链接到如何找出与矩阵的特定特征值相对应的特征向量?并表示它不计算左特征向量,但您可以通过使用转置来解决这个问题。

例如,

In [901]: import numpy as np

In [902]: import scipy.sparse.linalg as sla

In [903]: M = np.array([[0.5, 0.25, 0.25, 0], [0, 0.1, 0.9, 0], [0.2, 0.7, 0, 0.1], [0.2, 0.3, 0, 0.5]])

In [904]: M
Out[904]: 
array([[ 0.5 ,  0.25,  0.25,  0.  ],
       [ 0.  ,  0.1 ,  0.9 ,  0.  ],
       [ 0.2 ,  0.7 ,  0.  ,  0.1 ],
       [ 0.2 ,  0.3 ,  0.  ,  0.5 ]])

In [905]: eval, evec = sla.eigs(M.T, k=1, which='LM')

In [906]: eval
Out[906]: array([ 1.+0.j])

In [907]: evec
Out[907]: 
array([[-0.32168797+0.j],
       [-0.65529032+0.j],
       [-0.67018328+0.j],
       [-0.13403666+0.j]])

In [908]: np.dot(evec.T, M).T
Out[908]: 
array([[-0.32168797+0.j],
       [-0.65529032+0.j],
       [-0.67018328+0.j],
       [-0.13403666+0.j]])

标准化特征向量(你知道它应该是实数):

In [913]: u = (evec/evec.sum()).real

In [914]: u
Out[914]: 
array([[ 0.18060201],
       [ 0.36789298],
       [ 0.37625418],
       [ 0.07525084]])

In [915]: np.dot(u.T, M).T
Out[915]: 
array([[ 0.18060201],
       [ 0.36789298],
       [ 0.37625418],
       [ 0.07525084]])

如果您事先不知道特征值 1 的重数,请参阅 @pv. 的注释,显示使用的代码scipy.linalg.eig。这是一个例子:

In [984]: M
Out[984]: 
array([[ 0.9 ,  0.1 ,  0.  ,  0.  ,  0.  ,  0.  ],
       [ 0.3 ,  0.7 ,  0.  ,  0.  ,  0.  ,  0.  ],
       [ 0.  ,  0.  ,  0.25,  0.75,  0.  ,  0.  ],
       [ 0.  ,  0.  ,  0.5 ,  0.5 ,  0.  ,  0.  ],
       [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  1.  ],
       [ 0.  ,  0.  ,  0.  ,  0.  ,  1.  ,  0.  ]])

In [985]: import scipy.linalg as la

In [986]: evals, lvecs = la.eig(M, right=False, left=True)

In [987]: tol = 1e-15

In [988]: mask = abs(evals - 1) < tol

In [989]: evals = evals[mask]

In [990]: evals
Out[990]: array([ 1.+0.j,  1.+0.j,  1.+0.j])

In [991]: lvecs = lvecs[:, mask]

In [992]: lvecs
Out[992]: 
array([[ 0.9486833 ,  0.        ,  0.        ],
       [ 0.31622777,  0.        ,  0.        ],
       [ 0.        , -0.5547002 ,  0.        ],
       [ 0.        , -0.83205029,  0.        ],
       [ 0.        ,  0.        ,  0.70710678],
       [ 0.        ,  0.        ,  0.70710678]])

In [993]: u = lvecs/lvecs.sum(axis=0, keepdims=True)

In [994]: u
Out[994]: 
array([[ 0.75, -0.  ,  0.  ],
       [ 0.25, -0.  ,  0.  ],
       [ 0.  ,  0.4 ,  0.  ],
       [ 0.  ,  0.6 ,  0.  ],
       [ 0.  , -0.  ,  0.5 ],
       [ 0.  , -0.  ,  0.5 ]])

In [995]: np.dot(u.T, M).T
Out[995]: 
array([[ 0.75,  0.  ,  0.  ],
       [ 0.25,  0.  ,  0.  ],
       [ 0.  ,  0.4 ,  0.  ],
       [ 0.  ,  0.6 ,  0.  ],
       [ 0.  ,  0.  ,  0.5 ],
       [ 0.  ,  0.  ,  0.5 ]])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

找到具有左特征值的马尔可夫稳态(使用 numpy 或 scipy) 的相关文章

随机推荐

  • WPF DataGrid - 我可以使用属性装饰 POCO 以获得自定义列名称吗?

    我在 WPF 中有一个 DataGrid 并用如下数据填充它 public enum Sharing Equal SurfaceBased public class Data public bool Active get set publi
  • 无法通过反射调用带有 varargs 参数的方法 - NoSuchMethodException

    我正在尝试使用反射来调用带有可变参数的方法 并抓住了NoSuchMethodException 我不明白这里出了什么问题 Code public class ReflectionTest public ReflectionTest priv
  • SwiftUI 中的 @Binding 和 ForEach

    我不明白如何使用 Binding结合ForEach在 SwiftUI 中 假设我想创建一个列表Toggles 来自布尔数组 struct ContentView View State private var boolArr false fa
  • 将当前样式表保存到本地存储

    我知道有人问过这个问题 但没有一个帖子可以帮助我解决这个问题 所以 事情是这样的 我的网站上有两个样式表 我想将最近使用的样式表保存到本地存储 样式表之间的切换效果很好 这是我的代码 window onload function var c
  • NSCache初始化用于存储ios UIImage

    我正在使用 NSCache 来存储图像 但这里的问题是一旦我在控制器之间切换 NSCache 就会清空 我希望这些项目至少在应用程序关闭或用户注销之前一直存在 假设我有一个选项卡视图 并且我将数据中的图像存储在第一个选项卡中 当我转到第二个
  • OWL-LIST 和 RDF-LIST 之间的区别

    我无法理解 OWL LIST 和 RDF LIST 之间的区别 其次 为什么OWL DL由于OWL序列化而不支持RDF LIST 以及如何在 OWL DL 中创建 OWL LIST 正如评论中提到的 我不认为有任何称为 OWL LIST 的
  • 当报告服务遇到错误时如何设置电子邮件通知

    我有一些配置为在报告服务中通过电子邮件传送的报告 昨晚我们遇到了一些网络中断 报告服务无法连接到数据库引擎 有什么方法可以配置在无法发送订阅时发送电子邮件通知吗 我正在使用报告服务 2008 R2 当电子邮件无法发送时您想要一封电子邮件吗
  • 在 MSVS C# 项目中找不到 C++/CLI DLL 命名空间(可成功重现)

    我有类似的问题在 MSVS 中找不到 C CLI DLL 命名空间 我用的是VS2010 我有一个 C CLI 程序集 DLL 其中包含有关非托管 C 代码的托管包装器 公共引用类 代码 当我从 C 项目引用此项目时 在我的实际项目中 它是
  • 如何从给定纬度和经度的地图中检索速度限制?

    我正在尝试从 Here API 地图获取速度限制 但我找不到方法 我在网站上尝试了几个示例 但唯一有效的示例是需要路线起点和终点的示例 我想获得仅给出一个点 或一个框 的速度限制 我必须使用哪个 api 有例子吗 https route c
  • Angularfire:如何查询数组中特定键的值?

    我有以下 json 对象 posts Jk3ipZ2EFgvkABHf9IX category JavaScript date 1426008529445 heading Lorem text dsvgfjds daefsrgfs defs
  • 在 Android 上使用 Facebook API 创建自定义墙贴

    我是 Android 上的 Facebook API 新手 基本上 我想做的是为我正在开发的应用程序创建自定义墙贴 就像当您听 Shazam 歌曲时 您可以与朋友分享结果 我相信我必须创建一个自定义附件 这是我设置附件的代码 mPostBu
  • 如何在不删除回收者视图中的位置的情况下删除项目?

    我真的需要你的帮助 我用很多关键词在谷歌上搜索了很多天 但我找不到 所以 我决定向你请教 所以 就在这里 实际上 我在 RecyclerView 中有一个按钮 但是这个按钮会根据可用的数据量而重复 有 带有文本 Baca 3x Baca 4
  • gitbranch -d 和 gitbranch -D 有什么区别

    我对 git 比较新 当我从另一个分支合并我的分支后 我发现了一些问题 现在我的状态是我已经通过合并提交了这些更改 但没有推送到 origin mybranch 所以我只想删除我的本地分支 然后我使用 gitbranch d mybranc
  • 定义 Javascript 原型

    以下两种 Javascript 原型之间的功能差异是什么 选择其中一种有什么好处 选项1 Person prototype sayName function name alert name 选项2 Person prototype sayN
  • Primefaces 5.1 日历弹出窗口不执行 valueChange 事件

    我尝试以这种方式使用带有弹出窗口的 primefaces 日历
  • Swift 5 - 如何使用 PDFKit 在 PDF 中创建表格

    我在 UIGraphicsPDFRendererFormat 中有信息 高度为 400 我想在其中附加一个表格 但如果表格比页面大 我需要自动创建新页面 并继续在其他页面中使用表格 我找到了有关将 UITableView 转换为 PDF 的
  • Swift json解码丢失json对象键顺序

    我有一个简单的 JSON 对象 values a b c d e 我想以这种方式将其解码为 Swift 结构 我以后可以迭代其中的键values与我收到 JSON 对象的顺序完全相同 这在斯威夫特中可能吗 我的尝试如下 let json v
  • 当列表视图滚动到最后一项/无限滚动列表视图时,UWP列表视图加载更多数据

    我的 UWP Windows 10 应用程序中有一个列表视图 理想情况下 应用程序启动时它将加载 100 个项目 当列表滚动到底部时 即滚动到列表视图中的最后一个项目时 API 调用将进行并加载另外 100 个项目等 这是我的代码
  • 获取所有只出现一次的元素

    使用 LINQ 我可以获得仅出现一次的所有 int 元素的列表吗 例如 1 2 4 8 6 3 4 8 8 2 会成为 1 6 3 Thanks var result from x in xs group xs by x into grp
  • 找到具有左特征值的马尔可夫稳态(使用 numpy 或 scipy)

    我需要使用一些 python 代码使用其转换矩阵的左特征向量找到马尔可夫模型的稳态 它已经成立于这个问题scipy linalg eig 无法提供所描述的实际左特征向量 但那里演示了修复 像往常一样 官方文档大多无用且难以理解 比不正确的格