计算吸收马尔可夫链的基本矩阵的最佳方法?

2024-01-08

我有一个非常大的吸收马尔可夫链(根据问题大小进行缩放——从 10 个状态到数百万个),它非常稀疏(大多数状态只能对 4 或 5 个其他状态做出反应)。

我需要计算该链的基本矩阵的一行(给定一个起始状态的每个状态的平均频率)。

通常,我会通过计算来做到这一点(I - Q)^(-1),但是我一直没能找到一个好的库来实现稀疏矩阵逆算法!我看过几篇关于它的论文,其中大部分是博士论文。水平的工作。

我的大部分谷歌结果都指向我一些帖子,讨论在求解线性(或非线性)方程组时不应该使用矩阵逆......我觉得这不是特别有帮助。基本矩阵的计算是否类似于求解方程组,而我根本不知道如何用另一个形式来表达一个?

因此,我提出两个具体问题:

计算稀疏矩阵的逆矩阵的一行(或所有行)的最佳方法是什么?

OR

计算大型吸收马尔可夫链的基本矩阵的一行的最佳方法是什么?

Python 解决方案会很棒(因为我的项目目前仍处于概念验证阶段),但如果我必须亲自动手使用一些好的 Fortran 或 C,那不是问题。

编辑:我刚刚意识到矩阵 A 的逆 B 可以定义为 AB=I,其中 I 是单位矩阵。这可能允许我使用一些标准的稀疏矩阵求解器来计算逆矩阵......我必须逃跑,所以请随意完成我的思路,我开始认为这可能只需要一个真正的基本矩阵财产...


假设你想做的是锻炼吸收前的预期步数 http://en.wikipedia.org/wiki/Absorbing_Markov_chain#Expected_number_of_steps,维基百科上转载的“有限马尔可夫链”(Kemeny 和 Snell)的方程为:

或者扩展基本矩阵

重新排列:

这是使用函数求解线性方程组的标准格式

将其付诸实践以证明性能差异(即使对于比您所描述的系统小得多的系统)。

import networkx as nx
import numpy

def example(n):
    """Generate a very simple transition matrix from a directed graph
    """
    g = nx.DiGraph()
    for i in xrange(n-1):
        g.add_edge(i+1, i)
        g.add_edge(i, i+1)
    g.add_edge(n-1, n)
    g.add_edge(n, n)
    m = nx.to_numpy_matrix(g)
    # normalize rows to ensure m is a valid right stochastic matrix
    m = m / numpy.sum(m, axis=1)
    return m

提出计算预期步数的两种替代方法。

def expected_steps_fundamental(Q):
    I = numpy.identity(Q.shape[0])
    N = numpy.linalg.inv(I - Q)
    o = numpy.ones(Q.shape[0])
    numpy.dot(N,o)

def expected_steps_fast(Q):
    I = numpy.identity(Q.shape[0])
    o = numpy.ones(Q.shape[0])
    numpy.linalg.solve(I-Q, o)

选择一个足够大的示例来演示计算基本矩阵时出现的问题类型:

P = example(2000)
# drop the absorbing state
Q = P[:-1,:-1]

产生以下时序:

%timeit expected_steps_fundamental(Q)
1 loops, best of 3: 7.27 s per loop

And:

%timeit expected_steps_fast(Q)
10 loops, best of 3: 83.6 ms per loop

需要进一步的实验来测试稀疏矩阵的性能影响,但很明显,计算逆矩阵比您预期的要慢得多。

与此处介绍的方法类似的方法也可用于步骤数的方差

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算吸收马尔可夫链的基本矩阵的最佳方法? 的相关文章

随机推荐

  • Apache Spark join 操作的扩展能力较差

    我在 Apache Spark 上运行 join 操作 发现没有弱可扩展性 如果有人能解释这一点 我将不胜感激 我创建两个数据帧 a b 和 a c 并通过第一列连接数据帧 我为 一对一 连接生成数据帧值 另外 我使用相同的分区器来避免随机
  • 文本字段在 iOS 模拟器上不显示键盘

    我试图使用基本文本字段在这里构建一个简单的登录屏幕 但我无法让键盘出现在模拟器中 通过物理键盘输入效果很好 但在 iOS 模拟器中没有可见的键盘 我必须明确打开它还是什么 感觉我在这里错过了一些非常基本的东西 buildLoginScree
  • 封闭件损坏 - 请帮我修复它

    in a 相关问题 https stackoverflow com questions 4584397 javascript countdown clock 4584501我已经发布了这段代码 它几乎可以工作 但计数器却不能 我们可以修复它
  • 如何在 OpenVDB 中对网格进行下采样

    OpenVDB中有什么好的方法可以对体素网格进行下采样吗 例如 我有体素大小为 1 0 的网格 8x8x8 我想要获得体素大小为 2 0 的网格 4x4x4 each voxel of new grid is some interpolat
  • CoreAudio - 如何确定播放aac文件的结尾

    我正在 iPhone 上使用 CoreAudio 但我无法找到如何知道歌曲何时播放完毕 我放了一个属性监听器kAudioQueueProperty IsRunning 它在开始播放时有效 但在文件结尾时无效 当我停止 AudioQueue
  • 如何显示api函数的输出?

    抱歉问基本问题 我正在尝试在 QPlainTextWidget 中显示 json 我有 api 函数 它有控制台输出并包含所有需要的数据 看起来像这样 int iperf run server struct iperf test test
  • npm 错误! 403 403 禁止 npm 发布

    我尝试在 npm 上发布公共包 但出现此错误 npm ERR code E403 npm ERR 403 403 Forbidden PUT https registry npmjs org clem b 2fweather Forbidd
  • OSX (XNU) 系统调用的实际记录在哪里?

    我正在浏览系统调用 master https opensource apple com source xnu xnu 4570 71 2 bsd kern syscalls master文件在这里 但根本没有记录 系统调用的文档是否存在 如
  • 谁能解释为什么这种排序不起作用?

    例如 如果我有一个这样的列表 List1 7 6 9 List1 List1 sort list sort 对列表进行就地排序并返回None 所以你实际上将该返回值分配给List1 i e None gt gt gt List1 7 6 9
  • Android Viewpager Tinder 类似 UI,具有 3D 卡堆栈外观

    我正在尝试使用 ViewPager 在 android 中创建一个类似火种的用户界面 我看过这个图书馆 https github com kikoso Swipeable Cards 但我希望在向右滑动后能够看到上一张卡片 因此首选 Vie
  • 如何在 IE 的 google chrome 框架插件中启用文件协议

    我想在带有 chrome 框架的 IE 中打开一个 Html5 页面 但只支持 http 协议 我无法从磁盘打开 html 文件 在注册表路径中HKCU 软件 Google ChromeFrame添加这个键 允许不安全URL 1 DWORD
  • 使用 jQuery 和 AJAX 加载部分页面

    我在页面 A 和 div 上有一个动态链接列表 我希望在其中加载基于 PHP 变量的另一个动态生成的页面 B 的内容 a href loader php id 1 Link 1 a a href loader php id 2 Link 2
  • 如何将 Amazon Redshift 连接到 python

    这是我的 python 代码 我想将我的 Amazon Redshift 数据库连接到 Python 但它在主机中显示错误 谁能告诉我正确的语法 我是否正确传递了所有参数 con psycopg2 connect dbname pg tab
  • 如何获取 CSV 文本文件中特定字段的最大值?

    我的每一行文本文件示例 CSV 逗号分隔 如下 2016 01 10 23 56 07 10 71 47 可以看出 字段 3 4 和 5 是numeric价值观 对于每一行 我只想得到maximum字段值3 and 4 就像是 awk F
  • 如何从命名空间实现函数?

    本质上 这是我的源代码 namespace name int func void int main void name int func void body return 0 现在 我想在不同的地方编写该函数 声明为 int 命名空间 您不
  • 从 multiprocessing.Process 继承的 Python 类的设置值问题

    为什么这段代码 import multiprocessing import time class Bot multiprocessing Process def init self self val 0 multiprocessing Pr
  • 寻找 Expression Blend 设计师 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 对于寻找 Expression Blend WPF 设计师来执行合同工作有哪些建议 我认为 本地 自由设计师的价格可能是最合理的 但我什至
  • Huggingface 的“resume_from_checkpoint”有效吗?

    我目前将我的教练设置为 training args TrainingArguments output dir f results model checkpoint evaluation strategy epoch learning rat
  • 这是在 Mul 中使用 cbw 的正确方法吗?

    我从 8 位和 8 位寄存器得到乘法 但是 当你有一个 16 位和一个 8 位时 我们如何在乘法之前进行转换 问题 需要提供260 19的代码片段 并打印结果 我做了 mov Ax 260 mov Al 19 cbw Mul Ax PutI
  • 计算吸收马尔可夫链的基本矩阵的最佳方法?

    我有一个非常大的吸收马尔可夫链 根据问题大小进行缩放 从 10 个状态到数百万个 它非常稀疏 大多数状态只能对 4 或 5 个其他状态做出反应 我需要计算该链的基本矩阵的一行 给定一个起始状态的每个状态的平均频率 通常 我会通过计算来做到这