我有10个变量,有10个单独的状态(十进制),我正在尝试创建一个2D马尔可夫转移矩阵。这意味着10^10行和10^10列的矩阵,这将是非常稀疏的。这太大了,无法处理,但我希望有一种方法来处理稀疏矩阵,特别是稀疏转移矩阵。
如果你不熟悉,转移矩阵提供了在下一个时间步中从一个“状态”转移到另一个“状态”的概率。因为我有这么多变量,所以我必须得到从10D空间到2D空间的投影(如果你愿意的话)。例如,如果我有两个变量,每个变量都是正的或负的,我就会有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谢谢!
发布于 2016-01-24 04:18:18
我还没有完全理解你的问题。但是,根据我的猜测,我认为您可能会使用动态贝叶斯网络来呈现您的模型。从数据结构的角度来看,你需要一个更压缩的数据结构,而不是2-D矩阵。你可以在谷歌上搜索“概率图形模型”来获得更多的想法。
发布于 2016-11-05 18:26:18
无论你使用哪种方法,你都会很难处理这么大的矩阵。这不是使用一台简单的笔记本电脑就能完成的操作。您将需要一台具有超大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..https://stackoverflow.com/questions/30307618
复制相似问题