【问题标题】:Very large, very sparse Markov Transition Matrices非常大、非常稀疏的马尔可夫转移矩阵
【发布时间】:2015-07-30 05:14:20
【问题描述】:

我有 10 个变量,有 10 个单独的状态(十分位数),我正在尝试创建一个 2D 马尔可夫转换矩阵。这意味着一个 10^10 行和 10^10 列的矩阵,这将是非常稀疏的。这太大了,无法使用,但我希望有一种方法可以处理稀疏矩阵,特别是稀疏转换矩阵。

如果您不熟悉,转移矩阵提供了在下一个时间步从一个“状态”移动到另一个“状态”的概率。由于我有这么多变量,我必须得到从 10D 空间到 2D 的投影(如果你愿意的话)。例如,如果我有 2 个变量,每个变量为正或负,我将有 2^2 = 4 个状态,++、--、+-、-+,这些将是行和列。这些值将是从行状态移动到列状态的一些概率。可能不可能从一种状态转到另一种状态,从而在矩阵的该位置产生零。这会产生如下内容:

           [+,+]      [+,-]      [-,-]      [-,+]
[+,+]  0.5500000  0.3500000  0.1000000  0.0000000
[+,-]  0.0000000  0.5500000  0.4500000  0.0000000
[-,-]  0.0000000  0.2500000  0.0000000  0.7500000
[-,+]  1.0000000  0.0000000  0.0000000  0.0000000

正如您可以推断的那样,生成的矩阵可能(并且可能是)非常稀疏,从而创建了一个庞大的矩阵,只有某些区域实际上会产生有用的信息。

我目前正在使用“markovchain”包从数据中生成经验转移矩阵。 (它是一个非常简化、较小的测试版本,仅使用 3 个变量,每个变量具有 3 个单独的状态。)如果我尝试创建一个太大的矩阵,它将引发错误,这将有许多“空”区域。有没有更好的包支持非常大、非常稀疏的矩阵?

这是我正在使用的函数,如果可以的话,它将产生大的稀疏矩阵:

theP <- markovchainFit(data = gdxReturnsUD)$estimate@transitionMatrix

谢谢!!!

【问题讨论】:

  • 10^100 太大了,什么都做不了,是的。即使你从十分位数到超过/低于中位数,你也会达到 10^30 的数量级。你必须简化你的模型。存储在稀疏矩阵中是可能的,但在这里没有帮助。

标签: r sparse-matrix markov-chains


【解决方案1】:

我还没有完全理解你的问题。但是,据我猜测,我认为您可能会使用动态贝叶斯网络来展示您的模型。从数据结构的角度来看,您需要一个更压缩的数据结构,而不是二维矩阵。 您可以谷歌“概率图形模型”以获得更多想法。

【讨论】:

    【解决方案2】:

    无论您使用哪种方法,您都将很难处理如此大的矩阵。这不是您可以使用简单的笔记本电脑执行的操作。您将需要一台具有极大 RAM 的机器。 或者设置一个计算机集群来完成繁重的工作(通过划分任务这应该是可能的)

    一旦您接触到这样的机器,您将需要手动创建矩阵。首先创建一个包含所需维度的空矩阵,然后使用一组表格函数逐渐填充它。

    类似这样的:

    ##create empty matrix
    dummymarkov<-matrix(nrow = 10^10, ncol = 10^10) 
    colnames(dummymarkov)<-unique(train$states)
    rownames(dummymarkov)<-unique(train_ver2$code)
    ##subset your data
    temp<-train[x:y] 
    ## table the subset
    tmp_table<-table(tmp$state[1:(nrow(tmp)-1)], tmp$state[2:nrow(tmp)])
    ## feed the larger matrix
    dummymarkov[rownames(tmp_table)[1],colnames(tmp_table)[1]]<-tmp_table[1,1]
    dummymarkov[rownames(tmp_table)[2],colnames(tmp_table)[1]]<-tmp_table[2,1]
    dummymarkov[rownames(tmp_table)[1],colnames(tmp_table)[2]]<-tmp_table[1,2]
    dummymarkov[rownames(tmp_table)[2],colnames(tmp_table)[2]]<-tmp_table[2,2]
    ##repeat process until finished, then use dummymarkov to calculate the transition matrix..
    

    【讨论】:

    • 好吧,矩阵的稀疏性质(希望)允许更少的野兽。矩阵大部分为零,实际上只需要对极少数位置进行操作。我认为有一些方法可以有效地处理这样的稀疏矩阵,而这正是我所寻找的。​​span>
    • 好吧,我对这个问题的经验很少,但我也找不到任何可用的方法或包来轻松应对它。
    • 我可以建议的是一个临时解决方案,它会让您完成一些编码工作:您可以尝试将值保存在具有 3 个组件(行、列、值)的向量中。这样,您就可以整齐地保存所有值,而所有零都不会占用空间。这只是意味着您将不得不更加努力地为所需的矩阵乘法编写解决方案
    猜你喜欢
    • 2018-05-12
    • 2011-03-11
    • 2016-11-22
    • 2016-04-11
    • 2012-05-29
    • 1970-01-01
    • 2015-01-10
    • 2018-02-09
    • 1970-01-01
    相关资源
    最近更新 更多