非常大,非常稀疏的马尔可夫转移矩阵

时间:2015-05-18 15:48:01

标签: r sparse-matrix markov-chains

我有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

感谢!!!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你将很难使用这种大型矩阵,无论你使用哪种方法。这不是你可以用一台简单的笔记本电脑做的动作......你需要一台拥有极大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..